Элемент с приложением: 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);
}
}
подробнее здесь