Элемент с приложением: showAsAction не отображается

Я не могу понять, почему неправильно и несовместимо (AndroidStudio говорит мне "должен использовать app:showAsAction с библиотекой appcompat) код

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/action_search"
      android:title="@string/action_search"
      android:icon="@drawable/search"
      android:showAsAction="always" />
</menu>

работает идеально, но правильная и совместимая версия, как

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
          android:title="@string/action_search"
          android:icon="@drawable/search"
          app:showAsAction="always" />
</menu>

не показывает мой значок вообще.

Я тестирую на Samsung GT P5210 (android v. 4.4.2) и Nexus 7 (4.4.4)

3 ответов


вещи, которые вы всегда должны проверить, когда вы хотите использовать панель действий

1) расширить ActionBarActivity вместо Activity

public class MainMenu extends ActionBarActivity{

2) есть стиль выбранный, как определено в манифесте

Манифест

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

стиль

    <style name="AppTheme"
    parent="Theme.AppCompat.Light.DarkActionBar">
    </style>

3) Выбор право на showAsAction

  <menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:**yourapp**="http://schemas.android.com/apk/res-auto" >
  <item android:id="@+id/action_search"
      android:icon="@drawable/ic_action_search"
      android:title="@string/action_search"
      **yourapp**:showAsAction="ifRoom"  />
    ...
  </menu>

это то, что большинство людей ошибитесь

4) определить Menu на Activity

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}

если вы делаете все следующее, ваша панель действий должна работать.

тогда вы должны добавить onClickListener для каждой позиции...


я просто перечитал ваш вопрос и увидел, что ваша проблема-полная противоположность (но некоторые части моего старого ответа все еще относятся к вашей проблеме), поэтому вот обновленный ответ:

обновление:

вы импортировали библиотеку appcompat в файл gradle, но, похоже, поддерживаете только устройства новее, чем API уровня 11 или 14? Если это так, проверка lint видит, что вы импортировали библиотеку appcompat через gradle, и он думает, что вы должны использовать ActionBarActivity из-за импорта вашей библиотеки. Вот почему вы получаете ошибку. Но как ваш android:showAsAction атрибут работает, вы используете родной Activity и собственный вызов атрибута правильный, даже если проверка корпии говорит, что это неправильно. Поэтому, если вы хотите удалить ошибку lint, вам нужно удалить AppCompat lib из файла gradle и, возможно, изменить тему активности на родную тему Holo Light, поскольку ваша текущая тема может зависеть от темы appcompat.

ответ почему так не работает с app пространство имен находится в XML-атрибуте загрузки для собственного кода библиотеки соответственно, который обрабатывается в старом ответе.

Ответ

если вы используете ActionBarActivity из библиотеки поддержки для достижения устройств ниже уровня API 11, основная проблема здесь заключается в том, что ActionBarActivity воссоздает некоторые из собственных атрибутов Android XML, таких как android:showAsActionв собственной области, которую вы определяете с помощью:

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

и затем получить к ним доступ с тем же атрибутом (здесь showAsAction) в app: пространство имен. Таким образом, ActionBarActivity не может видеть или достигать native android:showAsAction атрибут, поскольку он только ищет его в app пространство имен, а не android пространство имен.

если вы хотите использовать собственный атрибут, вы должны использовать native Activity С темой Holo, которая поддерживается только с уровня API 11 и выше.


addthis:

yourapp:showAsAction="ifRoom"

или

android:showAsAction

например:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/action_search"
          yourapp:showAsAction="ifRoom"  />

</menu>

и в деятельности:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.action_search:
            openSearch();
            return true;
        case R.id.action_compose:
            composeMessage();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

подробнее здесь