2.3 पर डोन सॉफ्टइन्पुट एक्शन लेबल के साथ मल्टीलाइन एडिट टेक्स्ट


82

क्या EditTextएंड्रॉइड 2.3 पर मल्टी-लाइन मौजूद है और IME एक्शन लेबल "संपन्न" का उपयोग करने का एक तरीका है ?

एंड्रॉइड 2.2 में यह कोई समस्या नहीं है, एंटर बटन आईएमई एक्शन लेबल "डन" ( android:imeActionLabel="actionDone") दिखाता है , और क्लिक किए गए सॉफ्ट इनपुट को खारिज करता है।

EditTextमल्टी-लाइन के लिए कॉन्फ़िगर करते समय, एंड्रॉइड 2.3 सॉफ्ट इनपुट कीबोर्ड के लिए "डन" क्रिया दिखाने की क्षमता को हटा देता है।

मैंने सॉफ्ट इनपुट एंटर बटन के व्यवहार को बदलने में कामयाबी हासिल की है KeyListener, हालाँकि एंटर बटन अभी भी एंटर की की तरह दिखता है।


यहाँ की घोषणा है EditText

<EditText
        android:id="@+id/Comment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="0dp"
        android:lines="3"
        android:maxLines="3"
        android:minLines="3"
        android:maxLength="60"
        android:scrollHorizontally="false"
        android:hint="hint"
        android:gravity="top|left"
        android:textColor="#888"
        android:textSize="14dp"
        />
<!-- android:inputType="text" will kill the multiline on 2.3! -->
<!-- android:imeOptions="actionDone" switches to a "t9" like soft input -->

जब मैं inputTypeगतिविधि में सामग्री दृश्य को लोड करने के बाद मूल्य की जांच करता हूं , तो यह निम्नानुसार दिखाई देता है:

inputType = 0x20001

जो है:

  • वर्ग = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
  • झंडे = InputType.TYPE_TEXT_FLAG_MULTI_LINE

जवाबों:


163

खैर, TextViewऔर EditorInfoडॉक्स को फिर से पढ़ने के बाद , यह स्पष्ट हो गया है कि प्लेटफॉर्म IME_FLAG_NO_ENTER_ACTIONमल्टी-लाइन टेक्स्ट विचारों के लिए मजबूर करने जा रहा है ।

ध्यान दें कि TextViewयह ध्वज आपके लिए बहु-पंक्ति पाठ दृश्य पर स्वचालित रूप से सेट करेगा।

EditTextमंच को कॉन्फ़िगर करने देने के बाद IME विकल्पों को उप-वर्ग और समायोजित करने के लिए मेरा समाधान है :

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    InputConnection connection = super.onCreateInputConnection(outAttrs);
    int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
    if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {
        // clear the existing action
        outAttrs.imeOptions ^= imeActions;
        // set the DONE action
        outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;
    }
    if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
    }
    return connection;
}

उपरोक्त में, मैं IME_ACTION_DONEभी मजबूर कर रहा हूं , भले ही यह थकाऊ लेआउट कॉन्फ़िगरेशन के माध्यम से प्राप्त किया जा सकता है।


24
मैं आमतौर पर 'omg धन्यवाद' जैसी सामान्य टिप्पणियाँ नहीं देता, लेकिन यह उत्तर पर्याप्त रूप से उपयोगी और अप्राप्य था कि मुझे लगा कि यह मान्यता के योग्य है। संक्षेप में, omg धन्यवाद। :-)
हलवाह

3
उत्तर के लिए +1 लेकिन यदि आप इस मामले में कोड से एक एडिटटेक्स्ट का इनपुट प्रकार सेट करते हैं। यह ऊर्ध्वाधर स्क्रॉल को हटाता है और क्षैतिज स्क्रॉल जोड़ता है। उस समस्या को हल करने के लिए नीचे दिए गए कोड का उपयोग करें। editTextObj.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE) आम तौर पर तब हो सकता है जब आप कई लेआउट में समान को शामिल करके किसी दृश्य का पुन: उपयोग कर रहे हों। @ मोहोरोब ने समाधान के लिए बहुत धन्यवाद दिया।
जैशिल दवे

2
यह एक सम्मोहन की तरह काम करता है! लेकिन मुझे वास्तव में कोड की समझ नहीं है। आपको कुछ जगह मिली जहाँ मैं पूरे ध्वज तंत्र के बारे में पढ़ सकता हूँ?
वानलेयूवेनब्रम

धन्यवाद, मैं एक शुरुआती हूं, मैंने इसे अपनी गतिविधि में डाल दिया है जो एक संवाद बॉक्स का उपयोग करता है EditText, इसलिए यह मेरी गतिविधि xml में नहीं है। मैंने अपनी गतिविधि में इस कोड को डालने की कोशिश की, लेकिन एक त्रुटि हुई The method onCreateInputConnection(EditorInfo) of type SMSMain must override or implement a supertype method:। आप superशुरुआत में कॉल करते हैं, इसलिए सुनिश्चित नहीं है कि समस्या क्या है। आपके पास कोई सुझाव है? धन्यवाद।
अज़र्सपॉट

@NoniA। आपको EditText का उपवर्ग बनाना होगा। और उस कक्षा में आपको इस विधि को कॉल करना होगा। एक क्लास बनाएँ जो EditText तक फैली हो। और उस विधि को उस कक्षा में रखें।
शाह

103

ओहोरोब का जवाब मूल रूप से सही है, लेकिन उनका कोड वास्तव में बेमानी है! यह मूल रूप से इस सरल संस्करण के बराबर है (आलसी पाठकों के लिए पूर्ण कोड):

package com.example.views;

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

// An EditText that lets you use actions ("Done", "Go", etc.) on multi-line edits.
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;
    }
}

ध्यान दें कि कुछ inputTypeविकल्प जैसे कि textShortMessageयह काम नहीं करता है! मेरा सुझाव है कि आप के साथ शुरू करते हैं inputType="text"। यहां बताया गया है कि आप इसे अपने XML में कैसे उपयोग कर सकते हैं।

<com.example.views.ActionEditText
    android:id=...
    android:layout_stuff=...
    android:imeOptions="actionDone"
    android:inputType="textAutoCorrect|textCapSentences|textMultiLine"
    android:maxLines="3" />

टिम्मम, क्या यह 2.3 पर परीक्षण किया गया है?
ओहोरोब

1
यदि आपका कोड 2.3 पर काम करता है, तो मेरा होना चाहिए। वे लगभग समान हैं, और मैं मेरा या आपका कोड आधारित हूं, इसलिए धन्यवाद! वहाँ 2.3 की idiosyncrasies है कि 4.0 में नहीं हैं? मानक "मल्टीलाइन एड पर कोई कार्रवाई नहीं" Google द्वारा जानबूझकर किया गया व्यवहार है।
टिम्मम्म

5
मैंने 2.3 (और 4.x) पर यह कोशिश की, और इसने मेरे आवेदन के लिए काम किया।
एमसीसी

2
@ matej.smitala हाँ, आपके पास दोनों नहीं हो सकते।
टिम्मम

1
सबसे अच्छे समाधान की खोज करने के घंटों के बाद, यह एंटर कुंजी के बिना एक बहु-पंक्ति संपादन पाठ को प्राप्त करने का सबसे अच्छा और सरल तरीका लगता है।
माइक्रोयूएनएन

56

EditText वर्ग को उप-वर्ग में लाने का एक वैकल्पिक समाधान इसके साथ अपने EditText उदाहरण को कॉन्फ़िगर करना है:

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

कम से कम, यह मेरे लिए एंड्रॉइड 4.0 पर काम करता है। यह EditText उदाहरण को कॉन्फ़िगर करता है ताकि उपयोगकर्ता एकल-पंक्ति स्ट्रिंग को संपादित करे जो कई लाइनों पर नरम-रैपिंग के साथ प्रदर्शित होती है, भले ही कोई IME क्रिया सेट हो।


2
@ फ़त्ज़िलोगिक: आप, श्रीमान, बहुत अधिक उत्थान के लायक हैं! यह उत्तर एक जीवन रक्षक था, और एक सरल भी। मेरा मतलब है, omg वाह। काश मैं एक से अधिक बार उत्थान कर पाता। बहुत धन्यवाद!
स्वयंवर

3
मैं 4.4.2 चला रहा हूं, और यह मेरे लिए या कम से कम मेरे काम करने के तरीके से नहीं हुआ। मैंने इसे एक्सएमएल में ही किया था, इसलिए शायद यह एक समस्या है। मैंने inputType को "textEmailAddress | textMultiLine," में स्क्रॉल किया है। "क्षैतिज रूप से असत्य, अधिकतम 500 तक (xml फ़ाइल), झूठी के लिए सिंगललाइन और कार्रवाई के लिए imeOptions को कॉन्फ़िगर करें। मैंने इनपुटटाइप से "textMultiLine" को हटाने की कोशिश की। TextMultiLine के साथ, मुझे कीबोर्ड पर ENTER कुंजी मिलती है, और इसके बिना, सब कुछ एक ही लाइन पर रहता है और फिर भी क्षैतिज रूप से स्क्रॉल करता है। यह सबसे आसान समाधान की तरह लग रहा था, लेकिन ऊपर वाला मेरे लिए काम करता है, इसलिए अभी इसके लिए जा रहा है।
प्रतिक्रियाशील-कोर

6
मेरी पिछली टिप्पणी के बारे में (इसे संपादित करने में असमर्थ), इस पर संदेह करना या तो MAX_VALUE को सेट नहीं करने के साथ एक समस्या थी या फिर संपादन के निर्मित होने के बाद इन्हें बदलना, मैंने यहाँ संकेत के अनुसार कोड की कोशिश की, और यह काम करता है! मैं सिर्फ दूसरों के लिए पोस्ट करना चाहता था, आप इसे XML में नहीं कर सकते (या मैं वैसे भी नहीं कर सकता)। अन्य सेटिंग्स मेरे पास हैं: सिंगललाइन = गलत, imeOptions = एक्शनNext, inputType = textEmailAddress (कोई मल्टीलाइन) नहीं।
प्रतिक्रियाशील-कोर

बहुत अच्छा काम करता है। पुराने उत्तर पर सुधार करने का यह एक अच्छा उदाहरण है !!
nnn

लॉलीपॉप चलाने वाले गैलेक्सी एस 5 पर मेरे लिए काम करना। महान समाधान। अजीब बात है कि xml में क्षैतिज रूप से
स्क्रॉलिंग सेट

7

पिछले जवाब के बाद

public class MultiLineText extends EditText {

    public MultiLineText(Context context) {
        super(context);
    }

    public MultiLineText(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

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

    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        InputConnection connection = super.onCreateInputConnection(outAttrs);
        int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
        if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {
            // clear the existing action
            outAttrs.imeOptions ^= imeActions;
            // set the DONE action
            outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;
        }
        if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
            outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        }
        return connection;
    }
}

इस तरह का उपयोग करें

<myapp.commun.MultiLineText
  android:id="@+id/textNotes"
  android:layout_height="wrap_content"
  android:minHeight="100dp"
  android:layout_width="wrap_content"
  android:hint="Notes"
  android:textSize="20sp"
  android:padding="7dp"
  android:maxLines="4"/> 

5

कार्रवाई पूरी करने के लिए, आप उपयोग कर सकते हैं:

एक्सएमएल

android:inputType="text|textCapSentences"    

जावा

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

मुझे उम्मीद है कि यह आपके लिए काम करेगा।


1

जाहिरा तौर पर मूल प्रश्न का उत्तर हां है, लेकिन मेरा मानना ​​है कि एंड्रॉइड टीम डेवलपर्स को यह सोचने की कोशिश कर रही है कि वे मल्टी-लाइन EditText का उपयोग कैसे करते हैं। वे नई कड़ियों को जोड़ने के लिए एंट्री कुंजी चाहते हैं और संभवतः यह उम्मीद करते हैं कि आप उस घटना को बढ़ाने के लिए एक बटन या कोई अन्य इनपुट साधन प्रदान करते हैं जिसे आप संपादित करते हैं।

मेरे पास एक ही मुद्दा है और मेरा स्पष्ट समाधान केवल एक किए गए बटन को जोड़ने के लिए था और एंटर बटन को नई सीमाएं जोड़ने दें।


क्षमा करें, हो सकता है कि मैं अपने प्रश्न के साथ पर्याप्त रूप से स्पष्ट नहीं हूं .. एक-लाइन इनपुट को नरम करने के लिए कई लाइनें हैं। अर्थात नई-पंक्ति वाले वर्णों की अनुमति नहीं है।
ओहोरोब

@ मुलिंस: क्या आपने अपना "किया हुआ" बटन सॉफ्टइन्पुट कीबोर्ड में जोड़ा था? "एंटर" करते समय आपने ऐसा कैसे किया?
एलेक्स.प्रीक

नहीं। मैंने कीबोर्ड पर अलग से UI पर एक बटन बनाया।
मुलिंस

1
खैर हो सकता है कि एंड्रॉइड टीम को अपनी सलाह का पालन करना चाहिए और मैसेजिंग ऐप में मल्टीलाइन टेक्स्टएडिट के एक्शन बटन को संदेश भेजने के बजाय नई सुर्खियां बनाना चाहिए।
तम्मम् सिप

0

अपने XML में इन विशेषताओं का उपयोग करें।

एंड्रॉयड: inputType = "textImeMultiLine"

एंड्रॉयड: imeOptions = "actionDone"

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