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




android (8)

मैंने एक गतिविधि और एक लेआउट के साथ एक बहुत ही सरल परीक्षण एप्लिकेशन बनाया। 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 पर क्लिक किया जाता है, तो यह आग नहीं करता है । बड़ी समस्या।


Answers

संपादन पाठ को क्लिक करने योग्य बनाएं। XML android:clickable="true" या कोड में

ed1.setClickable(true);

फिर करो

ed1.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
      Toast.makeText(getBaseContext(), "1",Toast.LENGTH_SHORT).show();
    }
  });

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>

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

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;
    }
});

जब आप वास्तव में इसकी आवश्यकता नहीं है (जैसे जब आप किसी गतिविधि में प्रवेश करते हैं) तो FocusChangeListener का उपयोग करने से बचें। बस इस तरह से अपने OnClickListener के साथ एक OnTouchListener सेट करें:

@Override
public boolean onTouch(View view, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            view.requestFocus();
            break;
    }
    return false;
}

इससे आपका EditText पहली बार में फ़ोकस प्राप्त करेगा, और आपका onClick पहली बार ठीक से काम करेगा।


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

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;
    }


});

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

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

इस मामले में:

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

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


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

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

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

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


अद्यतन : एंड्रॉइड के हाल के संस्करणों के अनुसार, ANDROID_ID साथ कई मुद्दों का समाधान किया गया है, और मेरा मानना ​​है कि यह दृष्टिकोण अब आवश्यक नहीं है। एंथनी के जवाब पर एक नज़र डालें।

पूर्ण प्रकटीकरण: मेरा ऐप मूल रूप से नीचे दिए गए दृष्टिकोण का उपयोग करता है लेकिन अब इस दृष्टिकोण का उपयोग नहीं करता है, और अब हम android-developers.blogspot.com/2011/03/… एंट्री में उल्लिखित दृष्टिकोण का उपयोग करते हैं, जो एम्मी के उत्तर लिंक (अर्थात्, UUID#randomUUID() उत्पन्न करना और सहेजना)।

इस सवाल के कई जवाब हैं, जिनमें से अधिकांश समय के "कुछ" काम करेंगे, और दुर्भाग्यवश यह पर्याप्त नहीं है।

उपकरणों के अपने परीक्षणों के आधार पर (सभी फोन, जिनमें से कम से कम एक सक्रिय नहीं है):

  1. परीक्षण किए गए सभी उपकरणों ने TelephonyManager.getDeviceId() लिए एक मान वापस कर दिया
  2. सभी जीएसएम डिवाइस (सभी सिम के साथ परीक्षण किए गए) ने TelephonyManager.getSimSerialNumber() लिए एक मान वापस कर दिया
  3. सभी सीडीएमए डिवाइस getSimSerialNumber() (अपेक्षित के रूप में getSimSerialNumber() लिए शून्य वापस लौटे
  4. Google खाते वाले सभी डिवाइसों ने ANDROID_ID लिए एक मान वापस कर दिया
  5. सभी सीडीएमए डिवाइसों ने ANDROID_ID और TelephonyManager.getDeviceId() दोनों के लिए एक ही मान (या समान मान का व्युत्पन्न) लौटाया - जब तक कि Google खाता सेटअप के दौरान जोड़ा गया हो।
  6. मुझे अभी तक कोई सिम के साथ जीएसएम डिवाइस का परीक्षण करने का मौका नहीं मिला है, जीएसएम डिवाइस जिसमें कोई Google खाता नहीं है, या हवाई जहाज मोड में से कोई भी डिवाइस नहीं है।

तो यदि आप डिवाइस के लिए कुछ अद्वितीय चाहते हैं, तो TM.getDeviceId() पर्याप्त होना चाहिए। जाहिर है कि कुछ उपयोगकर्ता दूसरों की तुलना में अधिक पागल हैं, इसलिए यह इन पहचानकर्ताओं में से 1 या अधिक के लिए उपयोगी हो सकता है, ताकि स्ट्रिंग अभी भी डिवाइस के लिए लगभग अनूठी हो, लेकिन स्पष्ट रूप से उपयोगकर्ता के वास्तविक डिवाइस की पहचान नहीं करता है। उदाहरण के लिए, एक UUID के साथ संयुक्त, String.hashCode() का उपयोग String.hashCode() :

final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);

final String tmDevice, tmSerial, androidId;
tmDevice = "" + tm.getDeviceId();
tmSerial = "" + tm.getSimSerialNumber();
androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
String deviceId = deviceUuid.toString();

परिणामस्वरूप कुछ ऐसा हो सकता है: 00000000-54b3-e7c7-0000-000046bffd97

यह मेरे लिए काफी अच्छा काम करता है।

जैसा कि रिचर्ड नीचे उल्लेख करता है, यह न भूलें कि आपको TelephonyManager प्रबंधक गुणों को पढ़ने की अनुमति की आवश्यकता है, इसलिए इसे अपने मैनिफेस्ट में जोड़ें:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

आयात libs

import android.content.Context;
import android.telephony.TelephonyManager;
import android.view.View;






java android onclick