web-dev-qa-db-ja.com

homeAsUpを有効にする方法、またはappcompat v21を使用してスタンドアロンツールバーでsetDisplayHomeAsUpEnabled()を呼び出す方法

V21 AppCompatライブラリを使用するようにアプリを変換しようとしているので、ActionBarの代わりにツールバーを使用し始めました。 (ActionBarActivityを拡張する)私のすべての通常のアクティビティでは、すべてがうまくいきます。しかし、PreferenceActivityを拡張するSettingsActivityでは、setSupportActionBar(actionbar)呼び出しを使用できません。「スタンドアロン」ツールバーを使用する必要があります。ツールバーは表示されますが、ツールバーに「home/up」ボタンを追加する方法がわかりません。

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);
        }
    }
}

layout/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>

layout/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"
    />

menu/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>

AndroidネストされたPreferenceScreen? にup/backボタンを表示する)==で説明されているように、actionBarStyleとdisplayOptionsをテーマに追加しようとしましたが、他の場所ではactionBarStyleはツールバーを使用するときに使用しますが、それらは正しいようです。

values/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>
48
Gavriel

@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);
        }
    }
}
58
Gavriel

?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"
        />
28
ls.illarionov

ここでパーティーに遅れる方法ですが、私はまだ0.02 $を提供します。 fragmentを使用してAppCompactActivityの上矢印マークを表示するために、次の方法でそれを行いました。

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

アクティビティ内のonClickイベントを処理しますonOptionsItemSelected

11
war_Hero

_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>
_
6

ソリューションをありがとう、追加する唯一のポイントは、使用する方が良いということです

NavUtils.navigateUpFromSameTask(SettingsActivity.this); 
2
Viktor Yakunin

ツールバーの背景パッチを定義します;)これは機能します。 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">

    .....
2
Stéphane

21より古いAPIのXML属性Android:navigationIconまたはapp:navigationIconを試してください。

0
Xingang Huang