Как включить homeAsUp или вызвать setDisplayHomeAsUpEnabled() на отдельной панели инструментов с помощью appcompat v21
Я пытаюсь преобразовать свое приложение, чтобы использовать библиотеку v21 AppCompat, поэтому я начал использовать панель инструментов вместо ActionBar. Во всех моих обычных действиях (которые расширяют ActionBarActivity) все в порядке. но в моем приложении SettingsActivity, который расширяет PreferenceActivity, и поэтому я не могу использовать вызов setSupportActionBar (actionbar), мне нужно использовать "автономную" панель инструментов. Появится панель инструментов, но я не могу понять, как добавить кнопку "домой/вверх" на панель инструментов.
SettingsActivity.java:
public class SettingsActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
Toolbar actionbar = (Toolbar) findViewById(R.id.actionbar);
if (null != actionbar) {
// In every other activity that extends ActionBarActivity I simply use:
// setSupportActionBar(actionbar);
// final ActionBar supportActionBar = getSupportActionBar();
// supportActionBar.setDisplayHomeAsUpEnabled(true);
// but in PreferenceActivity you need to add a standalone toolbar:
actionbar.setTitle(R.string.title_activity_settings);
actionbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SettingsActivity.this.finish();
}
});
// Inflate a menu to be displayed in the toolbar
actionbar.inflateMenu(R.menu.settings);
}
}
}
Макет/activity_settings.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".SettingsActivity"
tools:menu="settings"
tools:actionBarNavMode="standard"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
layout="@layout/actionbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@android:id/list" />
</LinearLayout>
Макет/actionbar.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/actionbar"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimaryDark"
app:theme="@style/AppTheme"
/>
меню/settings.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.fletech.android.redalert.SettingsActivity" >
</menu>
Я попытался добавить actionBarStyle и displayOptions к моей теме, как описано в Показать/вернуть кнопку на Android вложенных PreferenceScreen?, но в других местах люди сказали, что actionBarStyle выиграл 't использовать, когда я использую панель инструментов, и они кажутся правильными.
значения/themes.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="AppTheme.Base"/>
<style name="AppTheme.Base" parent="Theme.AppCompat">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimary</item>
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="windowActionModeOverlay">true</item>
<!-- Set AppCompat’s actionBarStyle -->
<item name="actionBarStyle">@style/MyActionBar</item>
</style>
<style name="MyActionBar" parent="Widget.AppCompat.ActionBar">
<item name="displayOptions">showHome|homeAsUp|showTitle</item>
</style>
<resources>
Ответы
Ответ 1
Решено решение Pedro Oliveira. Я даже мог найти пригодный для использования, который использует библиотека AppCompat (и, следовательно, уже включен в apk). Что еще это зеркало, поэтому он работает как для локальных, так и для rtl-локалей:
actionbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
и это все вместе, с поправкой от @VictorYakunin
public class SettingsActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
Toolbar actionbar = (Toolbar) findViewById(R.id.actionbar);
if (null != actionbar) {
actionbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
actionbar.setTitle(R.string.title_activity_settings);
actionbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavUtils.navigateUpFromSameTask(SettingsActivity.this);
}
});
// Inflate a menu to be displayed in the toolbar
actionbar.inflateMenu(R.menu.settings);
}
}
}
Ответ 2
Yout может использовать ?homeAsUpIndicator
вместо R.drawable.abc_ic_ab_back_mtrl_am_alpha
:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:navigationIcon="?homeAsUpIndicator"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="@string/title"
/>
Ответ 3
чтобы опоздать на вечеринку здесь, но я по-прежнему буду предоставлять свои 0,02 $.
я сделал это следующим образом, чтобы показать стрелку вверх в fragment
, используя AppCompactActivity
((MainActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
и обработать событие onClick внутри вашей активности onOptionsItemSelected
Ответ 4
Если вы укажете имя родительской активности в Manifest.xml
и метаданные для поддержки Android 4.0 и ниже, вы можете просто установить значок навигации (toolbar.setNavigationIcon(R.drawable.ic_action_back);
)
и он будет работать.
Пример Manifest.xml:
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ProductActivity"
android:label="@string/title_activity_product"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
Ответ 5
Спасибо за решение, единственное, что нужно добавить, это то, что лучше использовать
NavUtils.navigateUpFromSameTask(SettingsActivity.this);
Ответ 6
Определите фоновый 9patch для вашей панели инструментов;) он работает.
Вот toolbar_background.9.png
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/toolbar_background">
.....
Ответ 7
Попробуйте атрибут XML android: navigationIcon или приложение: navigationIcon для API старше 21 года.