मल्टी-लाइन EditText डोन एक्शन बटन के साथ


114

क्या सेट के EditTextसाथ एक विजेट होना संभव है android:inputType="textMultiLine", और android:imeOptions="actionDone"एक ही समय में?

मुझे एक बहु-पंक्ति संपादन बॉक्स चाहिए, जिसमें कीबोर्ड पर एक्शन बटन हो, एन्टर (कैरिज रिटर्न) नहीं, लेकिन यह काम नहीं करता है।

अग्रिम में धन्यवाद


मल्टीलाइन एडिट टेक्स्ट के साथ एक कंपाउंड विजेट की कोशिश करने और एक साथ संयुक्त बटन के बारे में क्या?
सबिन सेबेस्टियन 4

जवाबों:


194

उपयोग

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);

और XML में:

android:inputType="textMultiLine"

मेरे लिए कर्सर तब भी दिखाई देगा जब कीबोर्ड नीचे चला गया था, मुझे textField.setCursorVisible(false);एक अंदर जोड़ने की जरूरत थीonEditorActionListener
Fonix

4.2.2 और 7.1.1 पर काम करता है। धन्यवाद।
तेच्पू

1
बहुत अच्छी तरह से काम करता है ... मैं इसे खोजने के लिए संघर्ष किया। इस उत्तर को सर्वश्रेष्ठ उत्तर के रूप में चिह्नित किया जाना चाहिए
एमएफएएल

7
यह सब xml में सेट करने के विपरीत क्यों काम करता है?
एंड्रयू स्टीनमेट्ज़

1
इस जानकारी को खोजने के लिए स्ट्रगल किया गया। यह अभी भी एक आकर्षण की तरह काम कर रहा है!
कॉस्टिन

51

Android डॉक्यूमेंटेशन से: ' ' textMultiLine '' नॉर्मल टेक्स्ट कीबोर्ड, जो यूजर्स को टेक्स्ट के लंबे स्ट्रिंग्स को इनपुट करने देता है जिसमें लाइन ब्रेक (गाड़ी का रिटर्न) शामिल है'इसलिए यदि आप कीबोर्ड में' डन 'बटन रखना चाहते हैं तो TextMultiLine विशेषता उपयुक्त नहीं है।

बहु-रेखा प्राप्त करने का एक सरल तरीका (इस मामले में 3 पंक्तियों में) इनपुट फ़ील्ड के साथ संपादित बटन के साथ EditText का उपयोग करना है

android:lines="3" 
android:scrollHorizontally="false" 

हालाँकि, किसी कारण के लिए यह केवल मेरे लिए काम करता है अगर मैं इन सेटिंग्स को लेआउट फ़ाइल के बजाय कोड में करता हूं (onCreate) द्वारा

TextView tv = (TextView)findViewById(R.id.editText);
if (tv != null) {
    tv.setHorizontallyScrolling(false);
    tv.setLines(3);
}

मुझे उम्मीद है कि इससे किसी को मदद मिलेगी, क्योंकि यह पता लगाने में काफी समय लगा। यदि आप इसे प्रकट से कार्य करने का एक तरीका ढूंढते हैं, तो कृपया हमें बताएं।


4
मैं maxLines()इसके बजाय कोशिश करना चाहूंगा कि setLines()अगर आप ऊँचाई बदलने से बचना चाहते हैंEditText
डैनियल स्मिथ

मुझे लगता है कि प्रश्न में यह स्पष्ट नहीं किया गया है कि आपको android सेट करना चाहिए: imeOptions जैसे मान के साथ कार्रवाई करें। इस उत्तर को पूरा करते हुए, मुझे android: singleLine = "true" सेट करना था, भले ही setMaxLines इसे कोड द्वारा ओवरराइट कर दे (ऐसा नहीं करने पर आपको "Send" जैसे एंटर कुंजी नहीं देगा)। <Enter> कार्रवाई को पकड़ने के लिए, stackoverflow.com/questions/5014219/… से पहले उत्तर की जाँच करें ।
डीनाक्स

क्षमा करें, <Enter> कैप्चर करने के बारे में मुझे जो सबसे अच्छा विकल्प मिला, वह है @lscasper उत्तर यहां stackoverflow.com/questions/1489852/…
DNax

1
यह मेरे लिए पूरी तरह से काम करता है (उपयोग करते हुए setMaxLines(3)) बहुत बहुत धन्यवाद!
laurencevs

1
एक आकर्षण की तरह काम किया: बस एंड्रॉइड जोड़ें: imeOptions = "actionDone" android: inputType = "text" के रूप में अच्छी तरह से अपने XML के लिए और Android: लाइनों = "3" Android: स्क्रॉलहर्ल्वेली = "झूठा" XML से
निकालें

24

काम करने का उदाहरण! नीचे दिया गया कस्टम EditText वर्ग बनाएँ जो इस सुविधा का समर्थन करता है और xml फ़ाइल में वर्ग का उपयोग करता है। काम कोड:

package com.example;

import android.content.Context;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.EditText;

public class ActionEditText extends EditText
{
   public ActionEditText(Context context)
   {
       super(context);
   }

   public ActionEditText(Context context, AttributeSet attrs)
   {
       super(context, attrs);
   }

   public ActionEditText(Context context, AttributeSet attrs, int defStyle)
   {
       super(context, attrs, defStyle);
   }

   @Override
   public InputConnection onCreateInputConnection(EditorInfo outAttrs)
   {
       InputConnection conn = super.onCreateInputConnection(outAttrs);
       outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
       return conn;
   }
}

<com.example.ActionEditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:imeOptions="actionDone"
       android:inputType="textAutoCorrect|textCapSentences|textMultiLine" />

यह मेरे लिए काम करता है मेरी आवश्यकता एक एडिट टेक्स्ट बनाने की थी जो कि मल्टी लाइन के साथ-साथ सॉफ्ट कीज़ पर अगला बटन होना चाहिए ............... इसलिए बहुत बहुत धन्यवाद कि मैंने क्या किया संपादित पाठ में मैंने 2 लाइनें जोड़ीं android: inputType = "textMultiLine" android: imeOptions = "actionNext" और ऊपर दी गई कस्टम क्लास में मैंने किया: InputConnection con = super.onCreateInnConnection (outAttrs); //outAttrs.imeOptions & = ~ EditorInfo.IME_FLAG_NO_ENTER_ACTION; outAttrs.imeOptions & = EditorInfo.IME_ACTION_NEXT; वापसी कॉन;
यश

काम करता है। Andorid 6.0.1 पर परीक्षण किया गया।
एमिगुलस

9

कोटलिन में ऐसा करने के लिए (और वैकल्पिक रूप से अन्य कॉन्फ़िगरेशन भी लागू करें जैसे textCapSentencesआप इस एक्सटेंशन फ़ंक्शन का उपयोग कर सकते हैं:

// To use this, do NOT set inputType on the EditText in the layout
fun EditText.setMultiLineCapSentencesAndDoneAction() {
    imeOptions = EditorInfo.IME_ACTION_DONE
    setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or InputType.TYPE_TEXT_FLAG_MULTI_LINE)
}

उपयोग:

myEditText.setMultiLineCapSentencesAndDoneAction()

1
जून 2019 तक काम करता है! धन्यवाद :)
रोहन तनेजा

मेरे लिए कुंजी की setRawInputTypeजगह का उपयोग करना थाsetInputType
Tamoxin

9

मुझे लगता है कि यह आपके काम करने का तरीका है। होने android:inputType="textMultiLine", android:imeOptions="actionDone"महत्वपूर्ण कार्यक्षमता को अस्पष्ट बनाता है। बस यह ध्यान रखें कि आप उपयोग कर सकते हैं android:lines="10"और शायद निकाल भी सकते हैं android:inputType="textMultiLine", लेकिन यह निर्भर करता है कि आप कभी-कभी जिस चीज को हासिल करना चाहते हैं वह सिर्फ आपको चाहिए android:inputType="textMultiLine"और इसके लिए कोई प्रतिस्थापन नहीं है।

EditText ed=new EditText(this);
ed.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if(keyCode == KeyEvent.KEYCODE_ENTER){
                //do your stuff here
            }
            return false;
        }
});

एंड्रॉइड के साथ अधिकतम संख्याओं की एक निश्चित राशि का उपयोग करना : लाइनें = "10" ने मेरे लिए काम किया, कीबोर्ड पर ठीक बटन प्राप्त करना। अच्छी चाल अगर कोई जानता है कि उदाहरण के लिए एक छोटी अधिकतम रेखा के साथ कितनी लाइनें होंगी।
सूर्योपासक

मैं कीकोड को निष्क्रिय करना चाहता हूं # 66 क्या यह संभव है? मैं उसे कैसे कर सकता हूँ?
आदिल मलिक

1
क्यों keyCode == 66 के बजाय keyCode == EditorInfo.IME_ACTION_GO?
tse

5

यह मेरे लिए पूरी तरह से काम करता है

int lineNum = 2;
mEditText.setHorizontallyScrolling(false);
mEditText.setLines(3);

4

पुन: प्रयोज्य कोटलिन समाधान

इन मूल्यों को कोड में सेट करना केवल एक चीज थी जो मेरे लिए काम करती थी

edittext.inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
edittext.setHorizontallyScrolling(false)
edittext.maxLines = Integer.MAX_VALUE // Or your preferred fixed value

मुझे इसकी अक्सर आवश्यकता होती है, इसलिए कोड को साफ रखने के लिए इसे बनाया गया है:

fun EditText.multilineIme(action: Int) {
    imeOptions = action
    inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
    setHorizontallyScrolling(false)
    maxLines = Integer.MAX_VALUE
}

// Then just call
edittext.multilineIme(EditorInfo.IME_ACTION_DONE)

यदि आप 'पूर्ण' पर एक वैकल्पिक कस्टम क्रिया जोड़ना चाहते हैं, तो यह प्रयास करें:

fun EditText.multilineDone(callback: (() -> Unit)? = null) {
    val action = EditorInfo.IME_ACTION_DONE
    multilineIme(action)
    setOnEditorActionListener { _, actionId, _ ->
            if (action == actionId) {
                callback?.invoke()
                true
            }
            false
        }
    }
}

// Then you can call
edittext.multilineDone { closeKeyboard() }

// or just
edittext.multilineDone()

कॉलबैक में कीबोर्ड को आसानी से नियंत्रित करने की आवश्यकता है? इस पोस्ट को पढ़ें

फिर hideKeyboard()कॉल इन जोड़ेंEditText.multilineDone


1
Atयह एक महान उत्तर है
माइकल 23

3

संक्षिप्त उत्तर: नहीं, मेरा मानना ​​है कि यह एपीआई स्तर 11 (3.0) से पहले संभव नहीं है।

इसी मुद्दे को यहाँ क्रॉप किया गया (स्वीकृत उत्तर के लिए टिप्पणियों में चर्चा की गई):

एंड्रॉइड सॉफ्ट कीबोर्ड एक्शन बटन

अंतिम टिप्पणी से:

मेरे फोन पर कुछ ऐप्स को देखते हुए, मल्टीलाइन बॉक्स का अंतिम होना आम बात है, इसके नीचे एक दृश्यमान "Done" या "Send" बटन है (जैसे ईमेल ऐप)।


3

इस स्थिति में काम करने का एक सरल तरीका:

  • इस विशेषता को EditText पर रखें:

    android:inputType="textMultiLine" 
    android:scrollHorizontally="false"
  • फिर इस कोड को केवल कीबोर्ड को छिपाने के लिए जोड़ें जब ENTER दबाया जाता है:

    editText.setOnEditorActionListener(new OnEditorActionListener() 
    {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) 
        {
            editText.setSelection(0);
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);      
            return true;
         } 
         else 
         {
            return false;
         }
         }
    });

2

यदि यह ऑन-स्क्रीन कीबोर्ड के लुक के बारे में नहीं है, तो आप बस कीबोर्ड पर एक इनपुट श्रोता को रख सकते हैं और यदि उपयोगकर्ता नई इनपुट देता है, तो "किए गए" -स्टैटस को फायर कर सकता है।


2

यदि आप इनपुट विकल्प textImeMultiline का उपयोग imeoptions फ्लैगनेक्स्ट और एक्शननेक्स्ट के साथ करते हैं तो आपको कैरिज रिटर्न के बजाय अगला बटन मिलता है


2

हालांकि, मेरे द्वारा काम किए गए अन्य समाधानों में से किसी ने भी काम नहीं किया, लेकिन निम्नलिखित ने मुझे अपने दिनों के कुछ दिनों के साथ और अधिक गुगली के दिनों को खूबसूरती से बचाया। दुर्भाग्य से याद नहीं है कि मुझे कोड कहां से मिला है और इसलिए लेखक को वह श्रेय नहीं दे सकता है, जिसके वह हकदार हैं।

आपके जावा कोड में:

////////////Code to Hide SoftKeyboard on Enter (DONE) Press///////////////
editText.setRawInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD|InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
editText.setImeActionLabel("DONE",EditorInfo.IME_ACTION_DONE);              //Set Return Carriage as "DONE"
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
    {
                if (event == null) {
                    if (actionId == EditorInfo.IME_ACTION_DONE) {
                        // Capture soft enters in a singleLine EditText that is the last EditText
                        // This one is useful for the new list case, when there are no existing ListItems
                        editText.clearFocus();
                        InputMethodManager inputMethodManager = (InputMethodManager)  getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
                        inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
                    }

                    else if (actionId == EditorInfo.IME_ACTION_NEXT) {
                        // Capture soft enters in other singleLine EditTexts
                    } else if (actionId == EditorInfo.IME_ACTION_GO) {
                    } else {
                        // Let the system handle all other null KeyEvents
                        return false;
                    }
                } 
        else if (actionId == EditorInfo.IME_NULL) {
                    // Capture most soft enters in multi-line EditTexts and all hard enters;
                    // They supply a zero actionId and a valid keyEvent rather than
                    // a non-zero actionId and a null event like the previous cases.
                    if (event.getAction() == KeyEvent.ACTION_DOWN) {
                        // We capture the event when the key is first pressed.
                    } else {
                        // We consume the event when the key is released.
                        return true;
                    }
                } 
        else {
                    // We let the system handle it when the listener is triggered by something that
                    // wasn't an enter.
                    return false;
                }
                return true;
        }
});




1

मैं 4.x पर हूँ और कोशिश कर रहा हूँ setHor क्षैतिज रूप से () या (बिना setLine () या setMaxLines ()), साथ ही कई अलग-अलग XML विन्यास दिखाने के लिए Done बटन प्राप्त करने के लिए। उनमें से किसी ने भी काम नहीं किया। लब्बोलुआब यह है कि अगर आपका EditText मल्टी-लाइन है, तो एंड्रॉइड हमेशा "डन" बटन के बजाय कैरिज रिटर्न दिखाना चाहेगा, जब तक कि आप इसके चारों ओर कुछ हैक में नहीं डालते।

कम से कम शिकायत समाधान मैंने पाया कि गाड़ी वापसी के व्यवहार को हटाने में शामिल नहीं है: https://stackoverflow.com/a/12570003/3268329 । यह समाधान बहु-पंक्ति विचारों के लिए IME_FLAG_NO_ENTER_ACTION ध्वज की सेटिंग को बाध्य करने की एंड्रॉइड अथक इच्छा को शून्य कर देगा, जिससे डोन बटन गायब हो जाता है।


0

मैंने काफी समय तक संघर्ष किया, लेकिन आखिरकार मुझे एक समाधान मिल गया!

बस एक कस्टम एडिट टेक्स्ट बनाएं जैसे:

public class EditTextImeMultiline extends EditText {

    public void init() {
        addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                for (int i = s.length(); i > 0; i--)
                    if (s.subSequence(i - 1, i).toString().equals("\n"))
                        s.replace(i - 1, i, "");
            }
        });
        setSingleLine();
        setHorizontallyScrolling(false);
        this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                EditTextImeMultiline.this.setLines(EditTextImeMultiline.this.getLineCount());
            }
        });
    }

    public EditTextImeMultiline(Context context) {
        super(context);
        init();
    }

    public EditTextImeMultiline(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }
}

यह वर्ग लाइन हटाता है (\ n), पाठ को लपेटता है जैसा कि TextMultiline करता है, और आपको ImeAction द्वारा Enter बटन को बदलने की अनुमति देता है;)।

आपको सिर्फ क्लासिक एडिटटेक्स्ट क्लास के बजाय इसे अपने एक्सएमएल में कॉल करने की आवश्यकता है।

यहाँ तर्क समझाने के लिए:

  • EditText को सिंगललाइन के रूप में सेट करें, एंटर के बजाय ImeAction बटन दिखाने में सक्षम होने के लिए।
  • दृश्य के अंत तक पाठ को अगली पंक्ति में जाने के लिए क्षैतिज स्क्रॉलिंग निकालें।
  • OnGlobalLayoutListener के साथ लेआउट में परिवर्तन देखें, और इसे EditText द्वारा आयोजित वर्तमान पाठ के "lineCount" के लिए "लाइन" पैरामीटर सेट करें। यह वही है जो इसकी ऊंचाई को ताज़ा करता है।

0

वर्किंग सॉल्यूशन यहां है, अपना कस्टम EditTextView बनाएं (बस एक टेक्स्टव्यू का विस्तार करें) और ओवररिप करें onInCCCection ने स्वीकार किए गए उत्तर में कोड youll के एक टुकड़े को खोजा है: यहाँ पर Multiline EditText with Done SoftInput Action Label 2.3

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