java - onClick घटना ट्रिगर नहीं है | एंड्रॉयड




android (6)

एक मिनट के लिए यह पता लगाने के लिए मुझे ले जाया गया जब यह मेरे साथ हुआ। एक setOnClickListener और setOnClickListener साथ मेरी setOnClickListener आग नहीं लगती थी और तब मुझे एहसास हुआ कि यह वास्तव में मेरे xml लेआउट में एक और तत्व के नीचे था, इसलिए मैंने इसे बदल दिया:

 <RelativeLayout>
     <ImageButton>
     <LinearLayout></LinearLayout>
 </RelativeLayout>

इस मामले में:

 <RelativeLayout>
     <LinearLayout></LinearLayout>
     <ImageButton>
 </RelativeLayout>

और अचानक ImageButton को अन्य लेआउट द्वारा ओवरलैप नहीं किया जा रहा था क्योंकि अब इसे मूल लेआउट में बाद में जोड़ा गया था और अब हर बार शीर्ष पर था और काम करता है। सौभाग्य, हमेशा मज़ेदार जब मूल सामान अचानक काम करना बंद कर देता है

मैंने एक गतिविधि और एक लेआउट के साथ एक बहुत ही सरल परीक्षण एप्लिकेशन बनाया। onClick पहली बार दबाए जाने पर ट्रिगर नहीं करता है, जैसा कि इसे करना चाहिए।

वह काम:

package com.example.mytest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText ed1 = (EditText) findViewById(R.id.editText1);

        ed1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_LONG)
                        .show();

            }

        });
    }

}

अभिन्यास:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText1"
        android:ems="10" />

</RelativeLayout>

यदि आप इस एप्लिकेशन को चलाते हैं, और दूसरे editText पर क्लिक करते editText और फिर पहले वाले पर वापस आते हैं, तो यह onClick ट्रिगर नहीं करेगा। आप आगे और पीछे का चयन कर सकते हैं और यह onClick को ट्रिगर नहीं करेगा। मुझे इस बुनियादी कार्यक्षमता की आवश्यकता है, लेकिन इसे काम करने के तरीके के बारे में सोचने में सक्षम नहीं है। विचार?

नोटिस

मैंने अपने एपीआई स्तर 16 भौतिक उपकरण और मेरे एपीआई स्तर 8 एमुलेटर पर अनुशंसित सभी तरीकों की कोशिश की है, लेकिन मुझे एक ही समस्या है।

स्पष्टीकरण

जब editText1 पर ध्यान केंद्रित किया जाता है और उस पर क्लिक किया जाता है, तो onClick विधि फायर करती है। अगर editText2 को फोकस किया जाता है, और फिर editText1 पर क्लिक किया जाता है, तो यह आग नहीं करता है । बड़ी समस्या।


ऐसा इसलिए होता है क्योंकि पहला टैप दृश्य में फ़ोकस हासिल करता है। अगला टैप क्लिक को ट्रिगर करता है।

यदि आप दृश्य को गतिशील रूप से फुला रहे हैं, तो यह करें:

android:clickable="true"
android:focusable="false"
android:focusableInTouchMode="false"

यदि यह काम नहीं करता है, तो इसे मूल दृश्य पर भी लागू करने का प्रयास करें।


डेट पिकर के साथ काम करने का इसका सबसे सरल तरीका है।

private DatePickerDialog datePickerDialog;
EditText etJoiningDate;
etJoiningDate=(EditText)findViewById(R.id.etJoiningDate);

etJoiningDate.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:

                final Calendar cldr = Calendar.getInstance();
                int day = cldr.get(Calendar.DAY_OF_MONTH);
                int month = cldr.get(Calendar.MONTH);
                int year = cldr.get(Calendar.YEAR);
                // date picker dialog
                datePickerDialog = new DatePickerDialog(TestActivity.this,
                        new DatePickerDialog.OnDateSetListener() {
                            @Override
                            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                                etJoiningDate.setText(dayOfMonth + "/" + (monthOfYear + 1) + "/" + year);
                            }
                        }, year, month, day);
                datePickerDialog.show();

                break;
        }


        return false;
    }


});

मुझे शायद पार्टी में बहुत देर हो गई है, लेकिन यहाँ एक कोड स्निप किया गया है जो ऑनक्लिक पर समस्या को ठीक करता है () नहीं कहा जा रहा है:

ed1.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP && !v.hasFocus()) {
            // onClick() is not called when the EditText doesn't have focus,
            // onFocusChange() is called instead, which might have a different 
            // meaning. This condition calls onClick() when click was performed
            // but wasn't reported. Condition can be extended for v.isClickable()
            // or v.isEnabled() if needed. Returning false means that everything
            // else behaves as before.
            v.performClick();
        }
        return false;
    }
});

अवलोकन, जब कोई उपयोगकर्ता किसी भी UI घटक के साथ बातचीत करता है तो विभिन्न श्रोताओं को एक टॉप-डाउन क्रम में बुलाया जाता है। यदि उच्च प्राथमिकता वाले श्रोताओं में से एक "घटना का उपभोग करता है" तो निचले श्रोताओं को नहीं बुलाया जाएगा

आपके मामले में इन तीन श्रोताओं को क्रम से बुलाया जाता है:

  1. OnTouchListener
  2. OnFocusChangeListener
  3. OnClickListener

पहली बार उपयोगकर्ता एक EditText को स्पर्श करता है, जो फ़ोकस प्राप्त करता है ताकि उपयोगकर्ता टाइप कर सके। कार्रवाई यहाँ भस्म है। कम प्राथमिकता के लिए OnClickListener को नहीं कहा जाता है। प्रत्येक क्रमिक स्पर्श फोकस को परिवर्तित नहीं करता है, इसलिए ये घटनाएँ OnClickListener को प्रभावित करती हैं।

बटन (और इस तरह के अन्य घटक) एक स्पर्श घटना से फोकस प्राप्त नहीं करते हैं, इसीलिए हर बार OnClickListener को कहा जाता है।

मूल रूप से, आपके पास तीन विकल्प हैं:

  1. अपने आप एक OnTouchListener लागू करें:

    ed1.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(MotionEvent.ACTION_UP == event.getAction())
                editTextClicked(); // Instead of your Toast
            return false;
        }
    });

    जब भी EditText को छुआ जाएगा, यह हर बार निष्पादित होगा। ध्यान दें कि श्रोता false लौटता false , यह ईवेंट को अंतर्निहित OnFocusChangeListener पर ध्यान केंद्रित करने की अनुमति देता है, जिससे उपयोगकर्ता फोकस को बदल सकता है ताकि EditText में टाइप किया जा सके।

  2. OnClickListener के साथ एक OnFocusChangeListener लागू करें:

    ed1.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus)
                editTextClicked(); // Instead of your Toast
        }
    });

    यह श्रोता पहले स्पर्श की घटना को तब पकड़ता है जब फोकस बदल दिया जाता है जबकि आपका ऑनक्लीस्टलिस्टर हर दूसरी घटना को पकड़ लेता है।

  3. (यह यहां मान्य उत्तर नहीं है, लेकिन यह जानने के लिए एक अच्छी चाल है।) अपने XML में false लिए ध्यान false योग्य विशेषता सेट करें:

    android:focusable="false"

    अब OnClickListener क्लिक होने पर हर बार फायर करेगी। लेकिन इससे EditText बेकार हो जाता है क्योंकि उपयोगकर्ता अब किसी पाठ में प्रवेश नहीं कर सकता है ...

ध्यान दें:

getApplicationContext() मेमोरी लीक बना सकती है। एक अच्छी आदत यह है कि जब तक बिल्कुल आवश्यक न हो, इसका उपयोग न करें। आप सुरक्षित रूप से इसके बजाय v.getContext() उपयोग कर सकते हैं।

उम्मीद है की वो मदद करदे!


public class TestProject extends Activity implements OnClickListener {
TextView txtmsg;
EditText ed1, ed2;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    txtmsg = (TextView) findViewById(R.id.txtmsg);
    ed1 = (EditText) findViewById(R.id.edt1);
    ed2 = (EditText) findViewById(R.id.edt2);

    ed1.setOnClickListener(this);
    ed2.setOnClickListener(this);
}

@Override
public void onClick(View v) {


    if(v==ed1){
        txtmsg.setText("1");
        Toast.makeText(this, "first",Toast.LENGTH_SHORT).show();
    }
    if(v==ed2){
        txtmsg.setText("2");
        Toast.makeText(this, "second",Toast.LENGTH_SHORT).show();
    }

}

}

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <EditText
        android:id="@+id/edt1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:ems="10" />

    <EditText
        android:id="@+id/edt2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/edt1"
        android:layout_marginTop="14dp"
        android:ems="10" />

    <TextView
        android:id="@+id/txtmsg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/edt2"
        android:layout_below="@+id/edt2"
        android:layout_marginRight="22dp"
        android:layout_marginTop="160dp"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>




onclick