Android में EditText onClickListener


85

मुझे एक EditText चाहिए जो प्रेस करने पर एक DatePicker बनाता है। इसलिए मैं निम्नलिखित कोड लिखता हूं:

    mEditInit = (EditText) findViewById(R.id.date_init);
    mEditInit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog(DATEINIT_DIALOG);
        }

    });

लेकिन जब मैं EditText दबाता हूँ तो क्रिया विशिष्ट होती है: एक कर्सर जो टाइपिंग पाठ की प्रतीक्षा कर रहा है, वह डायलॉग दिखाता है जो मुझे चाहिए।


आपको EditText डायलॉग के बजाय स्पिनर का उपयोग करना चाहिए।
रयान आर

जवाबों:


129

जब EditText लाभ फ़ोकस हो जाता है, तो कीबोर्ड पॉप अप होता है। इसे रोकने के लिए, झूठी पर ध्यान देने योग्य सेट करें:

<EditText
    ...
    android:focusable="false"
    ... />

यह व्यवहार अलग-अलग निर्माताओं के एंड्रॉइड ओएस के स्वादों पर भिन्न हो सकता है, लेकिन जिन उपकरणों का मैंने परीक्षण किया है, उन पर मैंने पर्याप्त पाया है। यदि कीबोर्ड अभी भी पॉप अप होता है, तो पाठ के बजाय संकेत का उपयोग करने से भी मदद मिलती है:

myEditText.setText("My text");    // instead of this...
myEditText.setHint("My text");    // try this

एक बार जब आप ऐसा कर लेते हैं, तो आपके क्लिक श्रोता को वांछित काम करना चाहिए:

myEditText.setOnClickListener(new OnClickListener() {...});

यह काम करने लगता है, लेकिन जब आप किसी फ़ील्ड में टाइप करते हैं, और कीबोर्ड पर नेक्स्ट पर क्लिक करते हैं, तो यह फ़ील्ड को असत्य पर ध्यान देने योग्य छोड़ देता है।
स्टर्लिंग डियाज़

59

आम तौर पर, आप EditTextसामान्य व्यवहार के साथ अधिकतम अनुकूलता चाहते हैं।

तो आप के रूप में उपयोग नहीं करना चाहिए android:focusable="false", हाँ, दृश्य अभी ध्यान देने योग्य नहीं होगा जो बुरा लग रहा है। उदाहरण के लिए, बैकग्राउंड ड्रॉबल अपनी "दबाया" स्थिति को नहीं दिखाएगा।

इसके बजाय आपको क्या करना चाहिए:

myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // showMyDialog();
    }
});
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            // showMyDialog();
        }
    }
});

इनपुट प्रकार सेट करके TYPE_NULL, आप सॉफ़्टवेयर कीबोर्ड को पॉप अप करने से रोकते हैं।

OnClickListenerऔर सेट करके OnFocusChangeListener, आप यह सुनिश्चित करते हैं कि उपयोगकर्ता द्वारा EditTextफ़ील्ड में क्लिक करने पर आपका डायलॉग हमेशा खुलेगा , जब यह फ़ोकस (पहला क्लिक) और बाद के क्लिक्स पर प्राप्त होगा।

बस सेटिंग android:inputType="none"या setInputType(InputType.TYPE_NULL)हमेशा पर्याप्त नहीं है। कुछ उपकरणों के लिए, आपको android:editable="false"एक्सएमएल में भी सेट करना चाहिए , हालांकि यह पदावनत है। यदि यह अब काम नहीं करता है, तो इसे केवल नजरअंदाज कर दिया जाएगा (जैसा कि सभी XML विशेषताओं का समर्थन नहीं किया जाता है)।


जब मैं ऐसा करता हूं, तो संवाद बंद होने के बाद फिर से खुल जाता है क्योंकि एडिटटेक्स्ट लाभ फिर से ध्यान केंद्रित करता है। इसके आसपास कोई रास्ता?
AdamMc331

@ McAdam331 क्या यह EditTextघटक आपके लेआउट में एकमात्र विजेट है, शायद? क्या आप android:focusable="true"अपने मूल लेआउट में जोड़ने की कोशिश कर सकते हैं ?
caw

1
@ प्रतिक्रिया के लिए धन्यवाद, लेकिन मैंने इसे onTouch का उपयोग करके काम करने के लिए समाप्त कर दिया। धन्यवाद!
एडमएमसी 331 3

बस। अच्छा कर रहा है।
XueQing

31

मुझे भी बिल्कुल यही समस्या है। कोड ठीक है, लेकिन सुनिश्चित करें कि आप EditText के फ़ोकस करने योग्य मान को गलत में बदल दें।

<EditText
android:id="@+id/date"
android:focusable="false"/>

मुझे आशा है कि यह किसी को भी, जो इसी तरह की समस्या थी मदद करता है!


4
इसके अलावा सक्षम नहीं सेट करें = "गलत", जो
onClickListener

25

डिफ़ॉल्ट काम करना EditText: पहले क्लिक पर यह फ़ोकस करता है और दूसरे क्लिक पर यह हैंडल होता है onClickListenerजिससे आपको फ़ोकस को अक्षम करना होगा। इसके बाद सबसे पहले onClickListenerवसीयत को हैंडल करें पर क्लिक करें ।

ऐसा करने के लिए आपको इस android:focusableInTouchMode="false"विशेषता को अपने साथ जोड़ना होगा EditText। बस!

कुछ इस तरह:

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="false"
        android:inputType="text" />

4
यह काम करता है, लेकिन EditTextuneditable हो जाता है, और कर्सर दिखाई नहीं देता है।
CoolMind

17

यहाँ समाधान है जिसे मैंने लागू किया है

mPickDate.setOnKeyListener(new View.OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        showDialog(DATE_DIALOG_ID);
        return false;
    }
});

या

mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        showDialog(DATE_DIALOG_ID);

    }
});

अपने आप से अंतर देखें। तब से समस्या है (जैसे रिकनॉटफ़्रेड ने कहा) डेटवॉकर के माध्यम से तिथि प्रदर्शित करने और संपादित करने के लिए टेक्स्ट व्यू। TextEdit का उपयोग इसके प्राथमिक उद्देश्य के लिए नहीं किया जाता है। यदि आप DatePicker को फिर से पॉप-अप करना चाहते हैं, तो आपको इनपुट डिलीट (1 केस) या डी फोकस (2 डी केस) करने की आवश्यकता है।

रे


2
जब तक आप एक onClickListener नहीं जोड़ते हैं जो मैंने अभी-अभी onFocusChangeListener के साथ मिलकर किया है। यह काम करेगा :-)
neteinstein 18

दूसरा समाधान मेरे लिए काम किया है, धन्यवाद! :)
सेल्टिक

9

यदि आप EditText पर OnClick कार्रवाई का उपयोग करते हैं जैसे:

जावा:

mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATEINIT_DIALOG);
    }

});

या कोटलिन:

editTextChooseDate.setOnClickListener {
        showDialog(DATEINIT_DIALOG)
    }

तो, यह पूरी तरह से काम करेगा यदि आप xmlअपनी EditTextनिम्नलिखित पंक्तियों में डालते हैं:

एंड्रॉइड: इनपुट टाइप = "कोई नहीं" एंड्रॉइड: फोकस करने
योग्य = "झूठा"
एंड्रॉइड: कर्सरविजिब = "झूठा"

उदाहरण के लिए:

<EditText
            android:id="@+id/date_init" 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:hint="Select Date"
            android:inputType="none"
            android:focusable="false"
            android:cursorVisible="false"/>

या MaterialDesign के लिए

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/layoutEditTextChooseDate"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent">

    <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/date_init" 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:hint="Select Date"
            android:inputType="none"
            android:focusable="false"                      
            android:cursorVisible="false"/>

</com.google.android.material.textfield.TextInputLayout>

8

IMN मैं रिकोटाफ्रेड के बयान से असहमत हूं:

जब एडिटटेक्स्ट पर ध्यान केंद्रित किया जाता है तो संवाद को रोकना एक गैर-मानक इंटरफ़ेस की तरह लगता है।

दिनांक को संपादित करने के लिए एक डायलॉग प्रदर्शित करना जब एक एडिट टेक्स्ट प्रेस करता है वह डिफ़ॉल्ट के समान होता है, जो कि कीबोर्ड या संख्यात्मक कुंजी पैड को प्रदर्शित करना है । तथ्य यह है कि तारीख को उपयोगकर्ता को EditText संकेतों के साथ प्रदर्शित किया जाता है कि तिथि को बदला जा सकता है। दिनांक को गैर-संपादन योग्य TextView के रूप में प्रदर्शित करना उपयोगकर्ता को संकेत देता है कि दिनांक परिवर्तित नहीं हो सकती है।


7

अच्छा विषय है। खैर, मैंने ऐसा किया है। XML फ़ाइल में:

<EditText
    ...
    android:editable="false"
    android:inputType="none" />

जावा-कोड में:

txtDay.setOnClickListener(onOnClickEvent);
txtDay.setOnFocusChangeListener(onFocusChangeEvent);

private View.OnClickListener onOnClickEvent = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        dpDialog.show();
    }
};
private View.OnFocusChangeListener onFocusChangeEvent = new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus)
            dpDialog.show();
    }
};

6

निम्नलिखित मेरे लिए पूरी तरह से काम करता है।

सॉफ्ट कीबोर्ड को पॉप अप करने से रोकने के लिए पहले अपना तिथि पिकर विजेट का इनपुट 'कोई नहीं' सेट करें:

<EditText android:inputType="none" ... ></EditText>

फिर दिनांक बीनने वाले संवाद को दिखाने के लिए इन ईवेंट श्रोताओं को जोड़ें:

// Date picker
EditText dateEdit = (EditText) findViewById(R.id.date);
dateOfBirthEdit.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            showDialog(DIALOG_DATE_PICKER);
        }
        return false;
    }
});

dateEdit.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            showDialog(DIALOG_DATE_PICKER);
        } else {
            dismissDialog(DIALOG_DATE_PICKER);
        }
    }
});

एक अंतिम बात। यह सुनिश्चित करने के लिए कि तारीख पिकर से सही ढंग से टाइप किए गए दिन, महीने या साल कॉपी किए जाते datePicker.clearFocus()हैं, उदाहरण के लिए, मूल्यों को प्राप्त करने से पहले कॉल करें getMonth()


सिंपल फिक्स: बर्खास्तगी को हर शोजडायॉग से पहले करें, बस सुनिश्चित करें।
लुकास बत्तो

5

यह मेरे लिए काम करता है:

mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setKeyListener(null);
mEditInit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus)
            {
                mEditInit.callOnClick();
            }
        }
    });
mEditInit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATEINIT_DIALOG);
    }

});

3

यहाँ मेरे लिए क्या काम किया है

झूठे के लिए संपादन योग्य सेट करें

<EditText android:id="@+id/dob"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Date of Birth"
android:inputType="none"
android:editable="false"

/>

फिर OnFocusChange के लिए एक ईवेंट श्रोता जोड़ें

private  View.OnFocusChangeListener onFocusChangeDOB= new View.OnFocusChangeListener() {

@Override
 public void onFocusChange(View v, boolean hasFocus) {
   if (hasFocus){
     showDialog(DATE_DIALOG_ID);
   }
 }
};

3
Android 2.3.x चलाने वाले मोटोरोला फोन से सावधान रहें। यदि एडिटटेक्स्ट एक स्क्रॉल करने योग्य क्षेत्र में है, तो जब आप स्क्रॉल करेंगे, तो मोटोरोला स्वतः ही चारों ओर ध्यान केंद्रित करेगा। इसका मतलब है कि आप नीचे स्क्रॉल कर सकते हैं और जब EditText लाभ केंद्रित होता है, तो आपकी तिथि संवाद पॉप अप होता है, जो आश्चर्यजनक और बुरा है।
एरिक बर्क

2

जैसा कि डिलन किर्न्स ने सुझाव दिया, झूठे कामों पर ध्यान देने योग्य बनाना ठीक है। यदि आपका लक्ष्य कीबोर्ड को रद्द करना है, जब EditText पर क्लिक किया जाता है, तो आप उपयोग करना चाहते हैं:

mEditText.setInputType(0);

2

किसी ने जिक्र क्यों नहीं किया setOnTouchListener? प्रयोग करना setOnTouchListenerआसान है और सब ठीक है, और बस सही है अगर श्रोता ने इस घटना का सेवन किया है, तो झूठी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.