2015-07-23 4 views
0

ОбзорФрагмент BackStack не работает должным образом

Привет, я в настоящее время пытаются разработать приложение для Android с новым дизайном материала и compatipility обратно API15. На этот раз я хотел бы использовать только одно действие и несколько фрагментов, заменив их в активности. Несмотря на это, у меня уже есть несколько проблем, которые я либо решил, либо просто не появился ... Однако у меня все еще есть проблема с BackStack в FragmentManager. Кажется, что кнопка «Назад» и значок «назад» на панели инструментов (не панель действий!) Работают неправильно. У меня такое ощущение, что эта проблема почему-то вызвана использованием AppCompatActivity. BTW: Так как мне очень сложно понять, что способ кодирования приложения android app api22 с one Activity/multiple Fragments, каждый отзыв/критика от вас, ребята, очень приветствуются!

Проблема

кнопку Назад и обратно значок в панели инструментов не работает.

Когда я открываю настройки с помощью панели инструментов, ни обратная кнопка, ни задний значок на панели инструментов не возвращают меня к предыдущему фрагменту. Значок обратно в панели инструментов просто ничего и (программное обеспечение), не делать назад кнопка закрывает АРР,

Код

MainActivity

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Set toolbar 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     // Load in first fragment 
     getFragmentManager().beginTransaction() 
       .add(R.id.fragment_container, new MyListFragment()) 
       .commit(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      // Replace current fragment with settings fragment 
      getFragmentManager().beginTransaction() 
        .replace(R.id.fragment_container, new SettingsFragment()) 
        .addToBackStack(null) 
        .commit(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 

MyListFragment

Just a simple ListFragment 

SettingsFragment

public class SettingsFragment extends PreferenceFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Activate back icon in toolbar 
     ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     // Inflate preferences 
     addPreferencesFromResource(R.xml.settings); 
    } 

} 

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.v7.widget.Toolbar xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:minHeight="?attr/actionBarSize" 
     android:background="?attr/colorPrimaryDark" 
     app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 

    <FrameLayout 
     android:id="@+id/fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

значение/style.xml (такой же, как значение-V21/style.xml)

<resources> 

    <style name="AppTheme" parent="Theme.AppCompat.Light"> 
     <item name="windowNoTitle">true</item> 
     <item name="windowActionBar">false</item> 
     <item name="@color/primary">#2196F3</item> 
     <item name="@color/primaryDark">#1976D2</item> 
     <item name="@color/accent">#FF4081</item> 
    </style> 

</resources> 

Update

The (программное обеспечение) назад кнопки теперь работает при перезаписи onBackPressed() следующим образом:

public void onBackPressed() { 
    getFragmentManager().popBackStack(); 
} 

Однако значок на панели инструментов по-прежнему не возвращает меня обратно.

+0

Не могли бы вы объяснить, что вы имеете в виду, когда говорите, что кнопка «Назад» не работает? – Chaosit

+0

Когда я открываю настройки с помощью панели инструментов, ни обратная кнопка, ни обратный значок на панели инструментов не возвращают меня к предыдущему фрагменту. Значок «назад» на панели инструментов ничего не делает, и кнопка «назад» (программное обеспечение) закрывает приложение. – StupidBird

+0

вам нужно вручную переопределить кнопку «Назад» в optionItemsselected method –

ответ

1

Проблема с кнопкой «назад» в вашем Toolbar заключается в том, что она не предназначена для обратной навигации. Стрелка в обратном направлении в Toolbar предназначена для навигации «вверх» (невероятно запутанная порой) и часто имеет то же поведение, что и кнопка «назад» устройства. Смотрите эту ссылку для дальнейшего объяснения:

http://developer.android.com/design/patterns/navigation.html

Хотя есть конечно способы переопределить «вверх» поведение, (например,, переопределяя android.R.id.home в методе onOptionsItemSelected), возможно, имеет смысл добавить параметр SettingsActivity, который управляет параметром SettingsFragment. Затем вы можете установить родительский Activity параметра SettingsActivity в MainActivity в манифесте. Тогда как назад и вверх должны работать так, как вы хотите, не отвергая любое стандартное поведение ОС:

http://developer.android.com/training/implementing-navigation/ancestral.html

Надежда, что помогает!

0

AppCompatActivity использует SupportFragmentManager не FragmentManager, поэтому при начале перехода следует позвонить getSupportFragmentManager().

Обратите внимание, что для правильной работы ваших фрагментов также необходимо расширить android.support.v4.app.Fragment из библиотеки поддержки для заднего стека, чтобы работать как ожидалось.

В этом случае нет необходимости переопределять метод onBackPressed().

Смежные вопросы