2014-02-18 3 views
1

В MainActivity у меня есть NavigationDrawer, который выглядит следующим образом:ясно backstack/история navigationdrawer выбранного элемента

private void displayView(int position) { 

    ListFragment listFragment = null; 

    switch (position) { 
    case 0: 
     listFragment = new AlbumFragment(); 
     break; 
    case 1: 
     listFragment = new TrackFragment(); 
     break; 
    default: 
     break; 
    } 

    if (listFragment != null) { 

     FragmentManager fm = getSupportFragmentManager(); 
     fm.beginTransaction().replace(R.id.frame_container, listFragment).commit(); 

     // update selected item and title, then close the drawer 
     mDrawerList.setItemChecked(position, true); 
     mDrawerList.setSelection(position); 
     setTitle(navMenuTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
    } else { 
     // error in creating fragment 
     Log.e("MainActivity", "Error in creating fragment"); 
    } 
} 

В моей AlbumFragment я могу переключиться на TrackFragment, нажав на ListItems.

@Override 
public void onListItemClick(ListView l, View v, int position, long id) {  
    // get album & artist of selected album 
    String album = ((TextView) v.findViewById(R.id.albumTitle)).getText().toString(); 
    String artist = ((TextView) v.findViewById(R.id.albumArtist)).getText().toString(); 
    String[] albumFilter = {"albumFilter", album, artist}; 

    // Create new fragment and transaction 
    Fragment newFragment = new TrackFragment(); 
    Bundle args = new Bundle(); 
    args.putStringArray("filter", albumFilter); 
    newFragment.setArguments(args);  

    FragmentTransaction transaction = this.getActivity().getSupportFragmentManager().beginTransaction(); 

    // Replace whatever is in the fragment_container view with this fragment, 
    // and add the transaction to the back stack 
    transaction.replace(R.id.frame_container, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 

Теперь возникает следующая проблема: Если я нажму BackButton все в порядке, и я вернулся в AlbumFragment. Но если я открою NavigationDrawer и выберем Tracksfragment, а затем нажмите Backbutton, я вернусь к AlbumFragment, а за ним по-прежнему остается TrackFragment.

Дальнейший пояснение: Когда я выбираю альбом в AlbumFragment, отображаются только треки из этого альбома. Если я выберу треки из всех дорожек NavDrawer, отобразится ALL.

Так что в основном все, что я хочу, это то, что вся Backstack-History очищается, как только я выбираю элемент из NavDrawer. Я уже пробовал большинство решений подобных проблем, найденных здесь, но к сожалению, до сих пор ничего не работало.

У кого-нибудь есть решение этой проблемы?

+0

Я думал, что это может быть столь же легко, как добавить эту строку: 'fm.popBackStackImmediate()' перед совершением сделки в моя основная деятельность. Я также проверил BackStackEntryCount после этого, и он равен 0, поэтому он работает. Проблема в том, что я получаю исключение NullpointerException, вызванное AlbumFragment. Я не знаю, почему это выполняется после того, как я использую popBackStack() – f4b

ответ

0

Вы можете установить следующие флаги в намерении во время запуска другой деятельности:

Intent intent = new Intent(this, MainActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    startActivity(intent); 

Надежда это то, что вы искали.

+0

Где я должен это поставить? Внутри моей MainActivity ??? Извините, вы можете объяснить это более подробно? – f4b

+0

Вы можете поместить код при каждом новом действии. Вы должны делать это через намерения, верно? Если вы хотите изменить поведение Назад кнопок в определенной деятельности, вы можете переопределить onBackPressed() эта деятельность: @Override \t общественных недействительного onBackPressed() {// Начало активности здесь } – Keya

+0

Хорошо, но я в основном У меня есть только одно действие, которое управляет всеми моими фрагментами. Таким образом, я не думаю о намерениях. Я знаю об переопределении backButton, но я стараюсь избегать возиться с ним, так как я действительно не хочу изменять его поведение по умолчанию. Я все еще надеюсь на подход к очистке истории BackStack, когда я выбираю элемент NavDrawer. – f4b

0

Использование android.support.v4.content.IntentCompat так:

Intent intent = IntentCompat.makeRestartActivityTask(new ComponentName(DrawerActivity.this, Tracksfragment.class)); 
startActivity(intent); 
Смежные вопросы