मैं ImeOptions के किए गए बटन पर क्लिक कैसे करूं?


185

मैं कर रहा हूँ EditTextजहाँ मैं निम्नलिखित संपत्ति सेट कर रहा हूँ ताकि मैं कीबोर्ड पर किए गए बटन को प्रदर्शित कर सकूँ जब उपयोगकर्ता EditText पर क्लिक करे।

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

जब उपयोगकर्ता स्क्रीन कीबोर्ड (समाप्त टाइपिंग) पर किया गया बटन क्लिक करता है तो मैं एक RadioButtonस्थिति बदलना चाहता हूं ।

स्क्रीन कीबोर्ड से हिट होने पर मैं बटन को कैसे ट्रैक कर सकता हूं?

सॉफ्टवेयर कीबोर्ड पर नीचे दायें 'किया ’बटन दिखाते हुए स्क्रीनशॉट


1
हो सकता है OnKeyboardActionListener मुझे किसी भी कोड उदाहरण में मदद कर सकता है ??
d-man

जवाबों:


210

मैं रॉबर्ट्स और चिराग जवाब के संयोजन के साथ समाप्त हुआ:

((EditText)findViewById(R.id.search_field)).setOnEditorActionListener(
        new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        // Identifier of the action. This will be either the identifier you supplied,
        // or EditorInfo.IME_NULL if being called due to the enter key being pressed.
        if (actionId == EditorInfo.IME_ACTION_SEARCH
                || actionId == EditorInfo.IME_ACTION_DONE
                || event.getAction() == KeyEvent.ACTION_DOWN
                && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
            onSearchAction(v);
            return true;
        }
        // Return true if you have consumed the action, else false.
        return false;
    }
});

अद्यतन: उपरोक्त कोड दो बार कॉलबैक को दो बार सक्रिय करेगा। इसके बजाय मैंने निम्नलिखित कोड का विकल्प चुना है, जो मुझे Google चैट क्लाइंट से मिला है:

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    // If triggered by an enter key, this is the event; otherwise, this is null.
    if (event != null) {
        // if shift key is down, then we want to insert the '\n' char in the TextView;
        // otherwise, the default action is to send the message.
        if (!event.isShiftPressed()) {
            if (isPreparedForSending()) {
                confirmSendMessageIfNeeded();
            }
            return true;
        }
        return false;
    }

    if (isPreparedForSending()) {
        confirmSendMessageIfNeeded();
    }
    return true;
}

4
मैंने सिर्फ IME_ACTION_DONE की तलाश की और मुझे आश्चर्य हुआ कि यह ट्रिगर नहीं हुआ। इसके बाद मैंने ACTION_DOWN और KEYCODE_ENTER को भी देखा और अंत में यह onEditorAction () को चालू किया। चूंकि मुझे अंतर्निहित कीबोर्ड में कोई अंतर नहीं दिखाई देता है (मुझे उम्मीद है कि एंटर कुंजी हाइलाइट हो सकती है) मुझे आश्चर्य है कि एडिटटेक्स्ट XML लेआउट के लिए एंड्रॉइड: imeOptions = "actionSend" का उपयोग करने के लिए बिंदु क्या है।
किसी

यह उत्तर क्यों स्वीकार नहीं किया गया है। क्या यह कुछ मामलों में विफल रहता है ??
Archie.bpgc


2
दूसरा समाधान भी दो बार ट्रिगर किया गया है।
Bagusflyer

1
isPreparedForSending()दूसरा तरीका क्या है और क्यों है true?
कूलमाइंड

122

इसे आज़माएँ, इसे आपकी ज़रूरत के लिए काम करना चाहिए:


editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
       //do here your stuff f
       return true;
    }
    return false;
    } 
});

10
यह एचटीसी ईवो के लिए काम नहीं करता है। जहां तक ​​मैं समझने में सक्षम हूं, एचटीसी ने अपने स्वयं के नरम कीबोर्ड को लागू किया जो कि imeOptions की अनदेखी करता है।
दान

यह पर्याप्त है (ईवेंट कार्रवाई या मुख्य कोड को देखने की आवश्यकता नहीं है, जैसा कि स्वीकृत उत्तर में है); मेरे Nexus और Samsung परीक्षण उपकरणों पर काम करता है।
जोनीक

बस सुरक्षित रहने के लिए, कोड और दृश्य में कार्रवाई सुनिश्चित करें कि मैच <EditText android:imeOptions="actionDone" android:inputType="text"/>
bh_earth0

40
<EditText android:imeOptions="actionDone"
          android:inputType="text"/>

जावा कोड है:

edittext.setOnEditorActionListener(new OnEditorActionListener() { 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            Log.i(TAG,"Here you can write the code");
            return true;
        }    
        return false;
    }
});

यदि खंड में सच लौटना चाहिए आप इसे संभाला है कहने के लिए
टिम केआईएसटी

26

मुझे पता है कि यह सवाल पुराना है, लेकिन मैं यह बताना चाहता हूं कि मेरे लिए क्या काम किया।

मैंने एंड्रॉइड डेवलपर्स वेबसाइट से नमूना कोड का उपयोग करने की कोशिश की (नीचे दिखाया गया है), लेकिन यह काम नहीं किया। इसलिए मैंने EditorInfo वर्ग की जाँच की, और मुझे एहसास हुआ कि IME_ACTION_SEND पूर्णांक मान के रूप में निर्दिष्ट किया गया था 0x00000004

Android डेवलपर्स से नमूना कोड:

editTextEmail = (EditText) findViewById(R.id.editTextEmail);
editTextEmail
        .setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId,
                    KeyEvent event) {
                boolean handled = false;
                if (actionId == EditorInfo.IME_ACTION_SEND) {
                    /* handle action here */
                    handled = true;
                }
                return handled;
            }
        });

इसलिए, मैंने पूर्णांक मान को अपनी res/values/integers.xmlफ़ाइल में जोड़ा ।

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="send">0x00000004</integer>
</resources>

फिर, मैंने अपनी लेआउट फ़ाइल res/layouts/activity_home.xmlको निम्नानुसार संपादित किया

<EditText android:id="@+id/editTextEmail"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:imeActionId="@integer/send"
  android:imeActionLabel="@+string/send_label"
  android:imeOptions="actionSend"
  android:inputType="textEmailAddress"/>

और फिर, नमूना कोड ने काम किया।


17

OnKeyListener को कैसे सेट किया जाए, इसके बारे में अधिक जानकारी और इसे Done बटन के लिए सुनें।

सबसे पहले OnKeyListener को अपनी कक्षा के कार्यान्वयन अनुभाग में जोड़ें। फिर OnKeyListener इंटरफ़ेस में परिभाषित फ़ंक्शन जोड़ें:

/*
 * Respond to soft keyboard events, look for the DONE press on the password field.
 */
public boolean onKey(View v, int keyCode, KeyEvent event)
{
    if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
        (keyCode == KeyEvent.KEYCODE_ENTER))
    {
        // Done pressed!  Do something here.
    }
    // Returning false allows other listeners to react to the press.
    return false;
}

एक EditText वस्तु को देखते हुए:

EditText textField = (EditText)findViewById(R.id.MyEditText);
textField.setOnKeyListener(this);

2
: इसका कारण यह है अपने OnKeyListener नहीं रह गया है मुलायम महत्वपूर्ण घटनाओं के लिए निकाल दिया जाता है, एपीआई स्तर 17+ लक्षित कर आवेदन पर किसी भी अधिक काम नहीं करता है developer.android.com/reference/android/text/method/...
JJB

क्या वे अब एक विकल्प सुझाते हैं?
रॉबर्ट हॉक

2
मैंने EditorInfo.IME_ACTION_DONE की तलाश के लिए setOnEditorActionListener का उपयोग करने के लिए स्विच किया है, जो अच्छी तरह से काम करता है।
jjb

onKey को सही लौटना चाहिए, असत्य पर नहीं।
राल्फगैब

16

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

<EditText
  android:id="@+id/password"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:hint="@string/prompt_password"
  android:imeActionId="@+id/login"
  android:imeActionLabel="@string/action_sign_in_short"
  android:imeOptions="actionUnspecified"
  android:inputType="textPassword"
  android:maxLines="1"
  android:singleLine="true"/>

आपको पहले से ही इनपुट टाइप विशेषता से परिचित होना चाहिए। यह केवल Android को ईमेल पता, पासवर्ड या फोन नंबर जैसे पाठ के प्रकार की सूचना देता है। संभावित मूल्यों की पूरी सूची यहां पाई जा सकती है

हालाँकि, यह विशेषता थी imeOptions="actionUnspecified"कि मैं इसके उद्देश्य को नहीं समझता था। एंड्रॉइड आपको कीबोर्ड के साथ बातचीत करने की अनुमति देता है जो स्क्रीन के नीचे से पॉप अप होता है जब पाठ का उपयोग करके चुना जाता है InputMethodManager। कीबोर्ड के निचले कोने पर, एक बटन होता है, आमतौर पर यह "अगला" या "पूर्ण" कहता है, जो वर्तमान टेक्स्ट फ़ील्ड पर निर्भर करता है। Android आपको इसका उपयोग करके अनुकूलित करने की अनुमति देता है android:imeOptions। आप "भेजें" बटन या "अगला" बटन निर्दिष्ट कर सकते हैं। पूरी सूची यहां देखी जा सकती है

उसके बाद, आप तत्व के TextView.OnEditorActionListenerलिए परिभाषित करके एक्शन बटन पर प्रेस के लिए सुन सकते हैं EditText। आपके उदाहरण में:

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(EditText v, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE) {
       //do here your stuff f
       return true;
    }
    return false;
    } 
});

अब मेरे उदाहरण में मेरे पास android:imeOptions="actionUnspecified"विशेषता थी । यह तब उपयोगी होता है जब आप किसी उपयोगकर्ता को लॉगिन कुंजी दबाने की कोशिश करना चाहते हैं। अपनी गतिविधि में, आप इस टैग का पता लगा सकते हैं और फिर लॉगिन का प्रयास कर सकते हैं:

    mPasswordView = (EditText) findViewById(R.id.password);
    mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
            if (id == R.id.login || id == EditorInfo.IME_NULL) {
                attemptLogin();
                return true;
            }
            return false;
        }
    });

6

धन्यवाद करने के लिए chikka.anddev और एलेक्स कोहन Kotlin में यह है:

text.setOnEditorActionListener { v, actionId, event ->
    if (actionId == EditorInfo.IME_ACTION_DONE ||
        event?.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER) {
        doSomething()
        true
    } else {
        false
    }
}

यहां मैं Enterकुंजी की जांच करता हूं , क्योंकि यह EditorInfo.IME_NULLबदले में देता है IME_ACTION_DONE

Android imeOptions भी देखें = "एक्शनडोन" काम नहीं कर रहा है । जोड़े android:singleLine="true"में EditText


6

कोटलिन समाधान

कोटलिन में इसे संभालने का आधार तरीका है:

edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        callback.invoke()
        true
    }
    false
}

कोटलिन एक्सटेंशन

इसे edittext.onDone{/*action*/}अपने मुख्य कोड में कॉल करने के लिए उपयोग करें । आपके कोड को अधिक पठनीय और बनाए रखने योग्य बनाता है

fun EditText.onDone(callback: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

इन विकल्पों को अपने edittext में जोड़ना न भूलें

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

यदि आपको inputType="textMultiLine"समर्थन की आवश्यकता है , तो इस पोस्ट को पढ़ें


1
महान जवाब, साझा करने के लिए धन्यवाद! मुझे लगता है कि setOnEditorActionListenerहालांकि, के वापसी मूल्य के बारे में एक चेतावनी दे रहा है । शायद यह सिर्फ स्थानीय कॉन्फ़िगरेशन सेटिंग्स की बात है, लेकिन मेरे लिंटर वास्तव में, वास्तव में मुझे एक elseशाखा जोड़ना चाहते हैं ताकि श्रोता के रिटर्न स्टेटमेंट के रूप में "सच" को स्वीकार करने के लिए ( if-ब्लॉक के विपरीत)।
dbm

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