46

Я пытаюсь преобразовать свое приложение, чтобы использовать библиотеку v21 AppCompat, поэтому я начал использовать панель инструментов вместо ActionBar. Во всех моих обычных действиях (которые расширяют ActionBarActivity) все в порядке. но в моем приложении SettingsActivity, который расширяет PreferenceActivity, и поэтому я не могу использовать вызов setSupportActionBar (actionbar), мне нужно использовать «автономную» панель инструментов. Появится панель инструментов, но я не могу понять, как добавить кнопку «домой/вверх» на панель инструментов.Как включить homeAsUp или вызвать setDisplayHomeAsUpEnabled() на отдельной панели инструментов с помощью appcompat v21

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 к моей теме, как описано в Show up/back button on android nested PreferenceScreen?, но в других местах люди сказали, что actionBarStyle не будет использоваться, когда я буду использовать панель инструментов, и они кажутся правильными.

значения/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> 
+8

'Toolbar.setNavigationIcon' –

+0

Как об использовании PreferenceFragment с деятельностью, простирающейся ActionBarActivity? –

+0

@ Nguyễn Hoài Nam, это может быть и хорошее решение, есть ли у вас рабочий пример того, как добавить ActionBarActivity внутри PreferenceFragment? – Gavriel

ответ

54

решение @Pedro Оливейра работал. Я даже мог найти пригодный для использования, который использует библиотека AppCompat (и, следовательно, уже включен в apk). Что еще это также отражается, так что он работает как для литровых РТЛ локали:

actionbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); 

и это его ALLtogether, с коррекцией от @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); 
     } 
    } 
} 
+1

Имейте в виду, что для работы «NavUtils.navigateUpFromSameTask» вам необходимо объявить в своем дочернем действии (в данном случае теге «SettingsActivity») в манифесте соответствующую родительскую активность, т.е. 'Андроида: parentActivityName = "com.example.myfirstapp.MainActivity"'. –

+1

Требуется добавить 'NavUtils.navigateUpFromSameTask (SettingsActivity.this); '? Я только называю 'actionbar.setNavigationIcon();' и возвращается механизм работает – Sudara

+1

@S_Madushan Да, это не требуется, если вы объявили родительскую активность в 'Manifest' – Tomasz

2

Спасибо, только для решения пункт добавить, что лучше использовать

NavUtils.navigateUpFromSameTask(SettingsActivity.this); 
+0

Добро пожаловать, и спасибо за ваш комментарий. Я обновил ответ. – Gavriel

5

Если вы предоставите имя активности родителя в Manifest.xml и мета-данные для поддержки Android 4.0 и опустить, то вы можете просто установить navigati на значке (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> 
+0

'getSupportActionBar(). SetDisplayHomeAsUpEnabled (true);' getSupportActionBar(). SetHomeButtonEnabled (true); ' – Mussa

0

Try XML атрибут андроид: navigationIcon или приложение: navigationIcon для API старше 21.

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

    ..... 
24

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" 
     /> 
+1

Хотя это не полный ответ, это отличное обновление для ответа @Gavriel – tir38

+0

' app: navigationContentDescription = ".. . '' можно использовать для установки описания содержимого, например, «Навигация вверх» – darnmason

+1

@darnmason мы можем обрабатывать событие click для '? homeAsUpIndicator' в шаблоне xaml? –

8

путь до конца к партии здесь, но я по-прежнему предоставлять свои 0.02 $. я сделал это следующим образом, чтобы показать стрелок вверх отметку в fragment с помощью AppCompactActivity

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

и обрабатывать событие OnClick внутри вашей деятельности onOptionsItemSelected

+0

Речь идет о автономных панелях инструментов, а не о том, что они заданы как панель действий – mhenryk

+0

, вы устанавливаете панель инструментов в панели действий, чтобы это все еще сохранялось. –

+0

Я установил actionBar.setDisplayHomeAsUpEnabled (true); actionBar.setDisplayShowHomeEnabled (true); , Он работает нормально. У меня есть текстовое окно на панели инструментов, в котором отображается название. Я поместил textview в центр. Если я не включу обратную стрелку, то textivew войдет в центр. Если я включу стрелку назад, она не войдет в центр. Я много пробовал. Не удалось найти решение. –