Элементы действия, которые не отображаются в ActionBar с showAsAction = "ifRoom"

Я пытаюсь добавить некоторые элементы действия в свою панель действий поддержки. В моей деятельности я также добавил вкладки в панель действий.

Это выдержка из этой деятельности:

public class ShowEmails extends ActionBarActivity implements ShowEmailsFragmentInteractionListener { private IMAPClientService service; private boolean bound; private ActionBar ab; private MailDBHelper mdbhelper; private SQLiteDatabase db; private Intent client_service; <.........................> @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.client_service = new Intent(this, IMAPClientService.class); this.mdbhelper = new MailDBHelper(this.getApplicationContext(), MailDBHelper.MAIL_DB_NAME, null, MailDBHelper.MAIL_DB_VERSION); this.db = this.mdbhelper.openWriteable(); this.ab = this.getSupportActionBar(); this.ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); this.ab.show(); Tab t = ab.newTab().setText(R.string.all_emails) .setTabListener(new TabListener<ShowEmailsFragment>(this, "all", ShowEmailsFragment.class)); ab.addTab(t); new LoadTabsInBackground().execute(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.show_emails_bulk_action, menu); return super.onCreateOptionsMenu(menu); } } 

Класс LoadTabsInBackground добавляет некоторые вкладки в ActionBar после выполнения некоторой операции с базой данных.

Это ресурс меню, который я раздуваю:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/email_refresh" android:orderInCategory="1" android:showAsAction="ifRoom" android:title="@string/action_refresh" android:icon="@drawable/ic_menu_refresh"/> <item android:id="@+id/email_bulk_seen" android:orderInCategory="20" android:showAsAction="ifRoom" android:title="@string/action_seen" android:icon="@android:drawable/sym_action_email"/> <item android:id="@+id/email_bulk_delete" android:orderInCategory="40" android:showAsAction="ifRoom" android:title="@string/action_delete" android:icon="@android:drawable/ic_menu_delete"/> </menu> 

И вот выдержка из AndroidManifest.xml, где вы можете использовать тему, которую я использую, это Theme.AppCompat.Light :

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="it.dndonline.battleclient4android" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.Light" > <.......................> <activity android:name="it.dndonline.battleclient4android.Activities.ShowEmails" android:label="@string/title_activity_show_folders" android:theme="@style/Theme.AppCompat.Light" > </activity> <......................................> </application> </manifest> 

К сожалению, все кажется мне правильным, хотя вкладки загружены правильно, это означает, что ActionBar правильно работает, ни один из пунктов меню не загружается в панель действий. Установка значения showAsAction always ничего не меняет.

Я тестирую его на Android 2.3.3.

Я нашел проблему. В файле .xml меню произошла ошибка. Фактически, я добавил новое пространство имен:

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

Но тогда я все еще отношу это свойство так, как будто оно принадлежит пространству имен android :

android:showAsAction="ifRoom"

Правильный способ ссылки на это свойство – использовать:

app:showAsAction="ifRoom"

Причина принадлежит к app пространства имен.

Вот соответствующая часть в документации:

Если ваше приложение использует библиотеку поддержки для совместимости в версиях с Android 2.1, атрибут showAsAction недоступен из пространства имен android:. Вместо этого этот атрибут предоставляется библиотекой поддержки, и вы должны определить собственное пространство имен XML и использовать это пространство имен в качестве префикса атрибута. (Пользовательское пространство имен XML должно основываться на имени вашего приложения, но это может быть любое имя, которое вы хотите, и доступно только в пределах объема файла, в котором вы его объявляете.)

Я нашел ту же ошибку, и я ее разрешаю

 <item android:id="@+id/action_refresh" android:orderInCategory="100" xmlns:app="http://schemas.android.com/apk/res-auto" app:showAsAction="ifRoom" android:icon="@android:drawable/ic_delete" android:title="Delete"/> 

Add, xmlns:app="http://schemas.android.com/apk/res-auto" в середине кода, работает для меня 🙂