android - سلوك imeOptions ، imeActionId و imeActionLabel




android-input-method (3)

أنا جديد تمامًا في تطوير Android الأصلي ، وأحاول معرفة كيفية تخصيص أزرار إجراءات IME. لقد ألقيت نظرة على وثائق Google ، لكن يمكنني العثور على القليل من المعلومات حول السلوك المتوقع.

من الدليل الرسمي ، أدرك أنه يمكن تهيئة زر إجراء لوحة المفاتيح باستخدام السمات:

  • android: imeOptions يمكنها ضبط النص / معرف الزر المعروض بالقرب من مفتاح المسافة لبعض القيم المحددة مسبقًا (على سبيل المثال ، قم بتعيين تسمية المفتاح على Go والمعرّف على 2)
  • android: imeActionLabel اضبط تسمية الزر الظاهر داخل منطقة الإدخال عندما تكون لوحة المفاتيح في وضع ملء الشاشة ، وعادةً ما تكون في وضع أفقي. يمكن ضبطها على أي قيمة سلسلة.
  • android: imeActionId كما كان سابقًا ولكن اضبط المعرف الرقمي الذي تم تمريره إلى طريقة رد الاتصال

ولكن بعد بعض المحاولات التجريبية ، وجدت سلوكًا مختلفًا بين مستوى API 15 ومستويات API التالية.

لقد قمت بإعداد عنصر EditText بسيط بالسمات التالية:

<EditText
        ...
        android:imeOptions="actionGo"
        android:imeActionLabel="Custom"
        android:imeActionId="666"
        android:inputType="text"/>

لقد راجعت التأثير بمستويات واجهة برمجة التطبيقات المختلفة في كل من الوضع الرأسي والأفقي. ها هي النتيجة.

مستوى API 15 - 4.0.3

في الوضع الرأسي ، تكون تسمية المفتاح هي Go ويكون معرف الإجراء الذي تم تمريره إلى طريقة رد الاتصال هو 2 ، وفقًا لإعداد imeOptions.

في الوضع الأفقي ، يكون / id key هو Go / 2 كوضع عمودي ، بينما يكون الزر المعروض في منطقة الإدخال مخصص / 666 ، وفقًا لسمتي imeActionLabel و imeActionId.

مستوى API 16 و 17 و 18 - 4.1.2 و 4.2.2 و 4.3

في الوضع الرأسي والأفقي ، يتم عرض المفتاح والزر مع تسمية مخصصة ، ويرتبطان بـ 666 معرفًا ، متجاهلين سمة imeOptions.

عدم التطابق في السلوك مزعج جدًا بسبب:

  • مع مستوى واجهة برمجة التطبيقات> = 16 لا يمكنك التمييز بين زر المفتاح وزر منطقة الإدخال
  • مع مستوى API = 15 لا يمكنك تعيين أي نص مخصص لزر المفتاح.

هل تعرف كيفية الحصول على هذا في API 15 و 16+؟ أو إذا كانت هناك طريقة للحصول على سلوك ثابت عبر جميع (أو على الأقل جزء من) إصدارات API؟

ربما أفتقد شيئًا ما في إعدادات IME التي يمكنها ضبط السلوك المختلف ...

شكرا جزيلا!


إذا كان شخص ما يقوم بتصميم لوحة مفاتيح مخصصة لنظام Android ولديه مشكلة في تسمية مفتاح Enter ، فعليك القيام بما يلي. في نموذج لوحة المفاتيح المخصصة لنظام Android ، لدينا الطريقة التالية في SoftKeyboard.java:

@Override
    public void onStartInput(EditorInfo attribute, boolean restarting)
    {
        super.onStartInput(attribute, restarting);
.
. // the implementation
. 
        mCurKeyboard.setImeOptions(getResources(), attribute.imeOptions);
    }

قم بتغيير السطر الأخير إلى السطر التالي:

mCurKeyboard.setImeOptions(getResources(), attribute);

الآن في LatinKeyboard.java تغيير طريقة setImeOptions مثل رفع الصوت عاليا:

void setImeOptions(Resources res, EditorInfo ei)
    {
        if (mEnterKey == null)
        {
            return;
        }

        switch (ei.imeOptions & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION))
        {
            case EditorInfo.IME_ACTION_SEND:
                mEnterKey.iconPreview = null;
                mEnterKey.icon = null;
                mEnterKey.label = res.getText(R.string.label_send_key);
                break;
            case EditorInfo.IME_ACTION_GO:
                mEnterKey.iconPreview = null;
                mEnterKey.icon = null;
                mEnterKey.label = res.getText(R.string.label_go_key);
                break;
            case EditorInfo.IME_ACTION_NEXT:
                mEnterKey.iconPreview = null;
                mEnterKey.icon = null;
                mEnterKey.label = res.getText(R.string.label_next_key);
                break;
            case EditorInfo.IME_ACTION_SEARCH:
                mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_search);
                mEnterKey.label = null;
                break;
            default:
                mEnterKey.iconPreview = null;
                mEnterKey.label = res.getText(R.string.label_enter_key);
                mEnterKey.icon = null;
                break;
        }

        if (ei.actionLabel != null)
        {
            mEnterKey.iconPreview = null;
            mEnterKey.icon = null;
            mEnterKey.label = ei.actionLabel;
        }
    }

الآن تعرض لوحة المفاتيح المخصصة تسمية مناسبة بناءً على ما تم تعريفه في ملف xml لـ imeActionLabel.


عند بدء مشروع Android جديد ، فإنه يوفر تلميحًا جيدًا لسؤالك. هناك نشاط يسمى LoginActivity والذي يمكنك LoginActivity تسجيل دخول افتراضية. سوف ينتج عن هذا النشاط EditText نص كما يلي:

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

الآن إذا قرأت documentation ، imeOptions سمة imeOptions تسمح لك بتحديد إجراءات إضافية لحقل نص. على سبيل المثال ، تحتوي لوحة المفاتيح المنبثقة على إجراء في الزاوية اليمنى السفلية مثل "التالي". باستخدام imeOptions يمكنك تحديد إجراء آخر من قائمة محددة مسبقًا يوفرها Android. يمكنك تحديد شيء مثل "actionSend" أو "actionSearch".

بمجرد القيام بذلك ، من أجل النشاط ، يمكنك الاستماع لهذا الإجراء باستخدام معالج الأحداث setOnEditorActionListener :

    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;
        }
    });

لاحظ كيف نستهدف imeActionId هنا. إنها طريقة أخرى لاستهداف EditText في نشاطك ، مع وجود المرونة أيضًا لتغيير الإجراء على إدخال لوحة المفاتيح.


ما عليك .setImeActionLabel() الاتصال بـ. .setImeActionLabel() في رموز جافا لتعيين actionID (مرة أخرى) إلى الرقم المطلوب.

editText.setImeActionLabel(getString(R.string.xxx), EditorInfo.IME_ACTION_GO);




android-input-method