52

我正在尝试将我的应用程序转换为使用 v21 AppCompat 库,因此我开始使用 Toolbar 而不是 ActionBar。在我所有的常规活动(扩展 ActionBarActivity)中,一切都很好。但是在我扩展 PreferenceActivity 的 SettingsActivity 中,因此我不能使用 setSupportActionBar(actionbar) 调用,我需要使用“独立”工具栏。工具栏出现了,但我不知道如何将“主页/向上”按钮添加到工具栏。

设置活动.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 上显示上/后按钮中所述?,但是在其他地方有人说我使用Toolbar时不会使用actionBarStyle,他们似乎是对的。

值/主题.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>
4

7 回答 7

61

@Pedro Oliveira 的解决方案奏效了。我什至可以找到 AppCompat 库使用的可绘制对象(因此已经包含在 apk 中)。更重要的是,它还被镜像,因此它适用于 ltr、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);
        }
    }
}
于 2014-11-04T11:26:25.797 回答
29

你可以使用?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"
        />
于 2015-12-07T05:45:50.120 回答
12

在这里聚会迟到了,但我仍然会提供我的 0.02 美元。我按照以下方式在fragment使用中显示向上箭头标记AppCompactActivity

((MainActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

并在您的活动中处理 onClick 事件onOptionsItemSelected

于 2016-03-26T18:22:22.057 回答
7

如果您提供父活动名称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>
于 2015-06-22T14:42:00.047 回答
2

感谢您的解决方案,唯一要补充的是更好用

NavUtils.navigateUpFromSameTask(SettingsActivity.this); 
于 2014-12-12T19:41:49.840 回答
2

为您的工具栏定义一个背景 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">

    .....
于 2015-10-23T05:44:29.413 回答
0

尝试 XML 属性 android:navigationIcon 或 app:navigationIcon 用于 API 早于 21。

于 2015-09-16T16:29:29.920 回答