2014-12-10 1 views
2

Я использую ящик для навигации, и когда я выбираю элемент, он правильно заменяет предыдущий фрагмент на тот, который я выбрал, но если я открою другой, а затем нажмите кнопку «Назад» , он переходит к предыдущему действию, а не к предыдущему фрагменту, что не так, что он делает это?Возврат к предыдущему фрагменту не работает правильно

private void selectItem(int position) { 
    Fragment newFragment; 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    switch (position){ 
     case 0: 
      //Update 
      newFragment = new UpdateFragment(); 
      transaction.replace(R.id.content_frame, newFragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
      listView.setItemChecked(position, true); 
      setTitle(navigationDrawerItems[position]); 
      break; 
     case 1: 
      //Maps 
      newFragment = new TimetableFragment(); 
      transaction.replace(R.id.content_frame, newFragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
      listView.setItemChecked(position, true); 
      setTitle(navigationDrawerItems[position]); 
      break; 
     case 2: 
      //Timetables 
      newFragment = new TimetableFragment(); 
      transaction.replace(R.id.content_frame, newFragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
      listView.setItemChecked(position, true); 
      setTitle(navigationDrawerItems[position]); 
      break; 
     case 3: 
      //Notes 
      newFragment = new TimetableFragment(); 
      transaction.replace(R.id.content_frame, newFragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
      listView.setItemChecked(position, true); 
      setTitle(navigationDrawerItems[position]); 
      break; 
     case 4: 
      //About 
      newFragment = new AboutFragment(); 
      transaction.replace(R.id.content_frame, newFragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
      listView.setItemChecked(position, true); 
      setTitle(navigationDrawerItems[position]); 
      break; 
     case 5: 
      //Settings 
      newFragment = new SettingsFragment(); 
      transaction.replace(R.id.content_frame, newFragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
      listView.setItemChecked(position, true); 
      setTitle(navigationDrawerItems[position]); 
      break; 
    } 
    //listView.setItemChecked(position, true); 
    //setTitle(navigationDrawerItems[position]); 
    drawerLayout.closeDrawer(listView); 
} 

ответ

3

Вы можете использовать метод getFragmentManager().popBackStack() в onBackPressed:

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0) { 
     getFragmentManager().popBackStack(); 
     getFragmentManager().beginTransaction().commit(); 
    } 
    else { 
     super.onBackPressed(); 
    } 
} 

Не забудьте добавить фрагмент в BackStack как:

transaction.addToBackStack(null); 

Edit:

Чтобы показать имя текущего фрагмента в панели действий вы можете получить его на onResume вашего FragmentActivity:

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 

    FragmentManager fragManager = this.getSupportFragmentManager(); 
    int count = this.getSupportFragmentManager().getBackStackEntryCount(); 

    // Fetch last fragment 
    Fragment fragment = fragManager.getFragments().get(count>0?count-1:count); 

    // Check with your possible Fragment class 
    if(fragment instanceof OneFragment) 
    { 
     setTitle("OneFragment"); 
    } 
    else if(fragment instanceof TwoFragment) 
    { 
     setTitle("TwoFragment"); 
    } 
} 

Надеюсь, это поможет ツ

+0

Это довольно хорошо, хотя, когда я нажимаю кнопку «Назад», заголовок моей активности отражает текущий фрагмент, загруженный из backStack? –

+0

@MysticMagic Это довольно хорошо, хотя, когда я нажимаю кнопку «Назад», название моей активности отражает текущий фрагмент, загруженный из backStack? –

+0

Вы хотите отразить название? –

-1

Вы добавляете к нулю backstack -

transaction.addToBackStack(null); 

Заменить этот нуль с именем метки вашего фрагмента.

Он будет работать.

+0

Nop, вы можете установить значение null для этого метода. Не имеет значения, если он недействителен. – Suvitruf

+0

В соответствии с документом, для запоминания транзакции мы добавим его в backstack - http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String) –

+0

Он добавит фрагмент если вы установите значение null здесь, также он добавит фрагмент в стоп-кадр, если вы установите строку. – Suvitruf