studio - user input android




Multiline EditText with Done SoftInput Action Label on 2.3 (5)

هل هناك طريقة للحصول على نص متعدد الخطوط EditText موجود واستخدام تسمية الإجراء IME "تم" على Android 2.3؟

في Android 2.2 ، هذه ليست مشكلة ، يظهر الزر "إدخال" IME Action Label "Done" ( android:imeActionLabel="actionDone" ) ، ويرفض Soft Input عند النقر فوقه.

عند تكوين EditText المتعددة ، يزيل Android 2.3 القدرة على إظهار إجراء "تم" للوحة المفاتيح Soft Input.

لقد تمكنت من تغيير سلوك الزر إدخال الإدخال الناعم باستخدام 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 بعد تحميل إعداد عرض المحتوى في النشاط ، يتم عرضه على النحو التالي:

inputType = 0x20001

الذي:

  • class = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
  • العلامات = InputType.TYPE_TEXT_FLAG_MULTI_LINE

استخدم هذه السمة في XML الخاص بك.

الروبوت: inputType = "textImeMultiLine"

الروبوت: imeOptions = "actionDone"


الجواب أوههوروب هو الصحيح في الأساس ، ولكن رمزه هو حقا زائدة حقا! وهو ما يعادل بشكل أساسي هذا الإصدار الأكثر بساطة (رمز كامل للقراء البطيئة):

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" />

بعد الإجابة السابقة

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"/> 

حسنًا ، بعد إعادة قراءة مستندات EditorInfo و EditorInfo ، أصبح من الواضح أن النظام الأساسي IME_FLAG_NO_ENTER_ACTION إلى فرض 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 أيضًا ، على الرغم من أنه يمكن تحقيق ذلك من خلال تهيئة تخطيط مملة.


يبدو أن الإجابة على السؤال الأصلي هي نعم ، لكني أعتقد أن فريق Android يحاول جعل مطوري البرامج يفكرون قليلاً حول كيفية استخدام نص EditText متعدد الأسطر. انهم يريدون إدخال مفتاح لإضافة خطوط جديدة ، وربما نتوقع أن تقوم بتوفير زر أو وسيلة إدخال أخرى لرفع الحدث الذي انتهيت من تحريره.

لدي نفس المشكلة وكان حلّي الواضح هو ببساطة إضافة زر "تم" والسماح للزر "إدخال" بإضافة الخطوط الجديدة.





android-edittext