it-swarm.dev

تم تجاهل عنصر قائمة Android 4.3 showAsAction = "دائمًا"

أنا أستخدم مكتبة appcompat الجديدة المتوفرة على v7 بدءًا من Android 4.3 (مستوى API 18).

بغض النظر عن ما تم تحديده في showAsAction لعنصر قائمة ، فإنه لا يظهر - إنه ينشئ رمز قائمة تجاوز السعة دائمًا ، ويضع حتى عنصر قائمة واحد ضمن القائمة.

محاولة إضافة قائمة إلى نشاط مثل هذا:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_sizes, menu);
    return true;
}

وهنا بلدي القائمة XML:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        Android:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>

هل هو خلل في مكتبة الدعم الجديدة v7 ، أم أنه مجرد خطأ في الكود؟ لقد تم استخدام رمز مشابه مع ActionBarSherlock عدة مرات من قبل.

113
Mcingwe

ربما كنت في عداد المفقودين مساحة الاسم المطلوبة:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:[yourapp]="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>

استبدل [yourapp] باسم التطبيق الخاص بك أو أي مساحة اسم ترغب بها قلبك في كل مكان.

أشياء أخرى تستحق التدقيق:

  • معرفة ما إذا كان فصل النشاط الخاص بك يمتد ActionBarActivity

تحقق مما إذا استمرت المشكلة.


الوثائق المرجعية لنظام أندرويد: إضافة أزرار الإجراءات . هنا النص ذو الصلة:

إذا كان تطبيقك يستخدم مكتبة الدعم للتوافق مع الإصدارات التي تصل إلى Android 2.1 ، فإن سمة showAsAction غير متاحة من Android: مساحة الاسم. بدلاً من ذلك ، يتم توفير هذه السمة بواسطة مكتبة الدعم ويجب عليك تحديد مساحة اسم XML الخاصة بك واستخدام مساحة الاسم هذه كبادئة السمة. (يجب أن تستند مساحة اسم XML المخصصة إلى اسم التطبيق الخاص بك ، ولكن يمكن أن يكون أي اسم تريده ولا يمكن الوصول إليه إلا في نطاق الملف الذي تعلن عنه.)

309
Nikola Despotoski

احسب نفسي. مع مكتبة الدعم v7 ، يجب أن تدخل showAsAction ضمن مساحة اسم مخصصة مثل:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:balloonberry="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        balloonberry:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>
52
Mcingwe

تأكد أيضًا من استخدام inflater الصحيح في طريقة ActionBarActivity.onCreateOptionsMenu ().

الحل الصحيح:

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);

حل غير صحيح:

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);
28
petrnohejl

ل شظايا

سوف القوائم مع مساحة الاسم المخصصة منع showAsAction من العرض.

يعمل استخدام "Android:" بادئة showAsAction ، على الرغم من أن Android Studio سوف يلاحظك ينبغي استخدام مساحة اسم مخصصة.

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:id="@+id/action_add_checkin"
          Android:title="Add Checkin"
          Android:orderInCategory="10"
          Android:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add"/>
</menu>

هذا يستخدم أجزاء Android SDK 22 و Support v4 ، في حالة حدوث أي فرق.

24
Baker

حصلت على نفس المشكلة ، لكن على نظام Android 5. لديّ 3 عناصر لكن نظام التشغيل تجاهل السمة "دائمًا" وأظهر عنصرين فقط. هنا حل بلدي:

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}
16
Lukas

في حالتي ، اضطررت إلى الإزالة من ملف build.gradle الخاص بتطبيقي "com.Android.support:appcompat-v7:21.0.3".

لاحظ : أدخلت min min sdk = 14 ، وأنشئت مشروعًا بواسطة استوديو أندرويد ، تبعية غير ضرورية.

بعد هذا الاستبدال ، يمكنك كتابة Android: showAsAction = "دائمًا"

6
Anton Kizema

تأكد أيضًا أن لديك المسار الصحيح لمساحة الاسم. لن يعطيك رسالة خطأ إذا كان خطأ.

كان لدي

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:myapp="http://schemas.Android.com/res-auto">

بدلا من

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:myapp="http://schemas.Android.com/apk/res-auto">

كل ما أعرفه هو أنه لم يكن يعمل. لست متأكداً كيف تمكنت من نسيان جزء/apk من المسار ، لكن حدث ذلك. لا توجد رسالة خطأ ، مجرد خطأ بعيد المنال لتعقب.

6
BeccaP

قد لا يكون هذا هو حالتك ولكني كنت أستخدمها

new MenuInflater(this).inflate(R.menu.my_menu, menu);

تغييره إلى

getMenuInflater().inflate(R.menu.my_menu, menu);

إصلاح المشكلة!

4
Bakhshi

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

xmlns:app="http://schemas.Android.com/apk/res-auto"

وتغيير هذا الرمز

Android:showAsAction="always"

إلى

app:showAsAction="always"

وأخيرا

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/menu_add_size"
        Android:title="@string/menu_add_item"
        Android:orderInCategory="10"
        app:showAsAction="always"
        Android:icon="@Android:drawable/ic_menu_add" />
</menu>
0
Abdulhakim Zeinu

لقد حلها عن طريق استبدال

Android:showAsAction="ifRoom"

مع

app:showAsAction="ifRoom"

هذا هو menuitme XML تبدو ،

<item Android:id="@+id/action_refresh"
      Android:title="Refresh"
      Android:icon="@drawable/refresh2"
      app:showAsAction="ifRoom" />
0
Haris

أبسط طريقة هي:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:myapp="http://schemas.Android.com/apk/res-auto">

    <item
        Android:id="@+id/history"
        Android:icon="@drawable/icons8_history_white_medium"
        Android:title="History"
        myapp:showAsAction="always" />
    <item
        Android:id="@+id/synchrnonize"
        Android:icon="@drawable/icons8_synchronize_white_medium"
        Android:title="Synchronize"
        myapp:showAsAction="always" />
</menu>
0
Paweł

أضف مساحة اسم مخصصة مثل هذا إلى showAsAction و actionViewClass:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item Android:id="@+id/search"
    Android:title="@string/search"
    Android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="Android.widget.SearchView" />
0
Amirouche Zeggagh
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    >
    <item
        Android:id="@id/back"
        Android:icon="@drawable/back"
        app:showAsAction="always"
        Android:title="@string/back"/>
    <item
        Android:id="@id/save"
        Android:icon="@drawable/le_top_btn_icon_add"
        app:showAsAction="ifRoom"
        Android:title="@string/save"/>
</menu>

لا تعمل ، مع supportLibraryVersion = '25 .1.0 'compileSdkVersion = 25

انظر "تحذير"

يجب استخدام التطبيق: showAsAction مع مكتبة appcompat مع xmlns: app = "http://schemas.Android.com/apk/res-auto" أقل ... (Ctrl + F1)

عند استخدام مكتبة appcompat ، يجب أن تشير موارد القائمة إلى showAsAction في التطبيق: مساحة الاسم ، وليس مساحة الاسم: Android.

وبالمثل ، عند عدم استخدام مكتبة appcompat ، يجب أن تستخدم السمة Android: showAsAction.

أعتقد أن التحذير يمكن تجاهله.

0
Bill