4

Я сейчас царапаю голову этим. У меня есть ActionBarActivity, который загружает начальный Fragment - исходное меню завышено в рамках действия. Теперь у меня есть панель навигации, которая, когда выбран элемент, загружает другой фрагмент и добавляет его в заднюю часть.Назад навигация с фрагментами/панелью инструментов

Когда я делаю это, есть несколько вещей, которые я хочу задать:

  1. Установите дом, как на индикаторе
  2. Аннулируйте меню опций от основной деятельности
  3. Набор имеет опции верно для фрагмента
  4. Убедитесь, что индикатор вверх правильно переходит обратно к первоначальному Фрагмент

Someth довольно странно: индикатор вверх появляется только один раз и не ведет себя как кнопка «назад», и хотя я сделал недействительным и раздул новое меню, новое меню получает добавлено в исходное меню «Активность».

EDIT: Ok Я решен вопрос добавляемого - забыл добавить menu.clear() в методе onCreateOptionsMenu.

Моя раскладка панели навигации имеет onClick метод для всех пунктов меню, которые бы вызвать нагрузку другого фрагмента:

public void navItemClick(View view) { 

     switch (view.getId()) { 
      case R.id.ripSMS: 
       mNavigationDrawer.toggleHome(false); 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
       FragmentTransaction mTrans = getSupportFragmentManager().beginTransaction(); 
       mTrans.replace(R.id.voiceover_frame_layout,new MessageFragment(),"main_ui") 
         .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).addToBackStack("msg").commit(); 
       break; 
      case R.id.ripEmail: 
       break; 
      case R.id.ripSettings: 
       break; 
     } 

     mNavigationDrawer.closeDrawer(); 
    } 

toggleHome:

public void toggleHome(boolean show) { 
     mDrawerToggle.setDrawerIndicatorEnabled(show); 

     if (!show) { 
      mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
     } else { 
      mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
     } 
    } 

После того, как элемент срабатывает onCreate содержит Invalidate и код hasOptions:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActivity().invalidateOptionsMenu(); 
    setHasOptionsMenu(true); 
} 

Затем onCreateOptionsMenu раздувает другой макет меню (содержит один элемент, называемый настройками).

Как уже упоминалось, это только частично работает один раз - в первый раз, когда я использую элемент для загрузки фрагмента, я получаю обратную иконку, но она также не работает (это установлено в onOptionsItemSelected, чтобы проверить, нажата ли домашняя страница - это ничего не делает). Когда я нажимаю кнопку «Назад», он возвращает меня в нужное место. Однако, если я вернусь назад, стрелка назад теперь длиннее, даже если код проходит через onCreate!

ответ

11

Хорошо, поэтому мне удалось решить эту проблему после проб и ошибок. Два изменения сделаны:

  1. Реализовать addOnBackStackChangedListener
  2. ActionBarDrawerToggle'ssetToolbarNavigationClickListener необходимо установить

Как я только один вид деятельности (все остальное Фрагментные классы) Я добавил backstack слушателя Родитель данный вид деятельности onCreate метод:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      } else { 
       getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
      } 
     } 
    }); 

Это разрешало исчезновение стрелки назад, когда goi ng обратно к фрагменту.Наконец добавил слушатель в мой классе настройки NavigationDrawer в:

mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       getActivity().onBackPressed(); 
      } 
     }); 

Я полагаю, что только вопросы, у меня есть все, указало на использование onOptionsItemSelected метода с android.R.id.home, но это никогда не работало для меня. Возможно, это был способ, который я реализовал, конечно, но если кто-то видит что-то очевидное, почему, пожалуйста, дайте мне знать!

2

Эти шаги помогут вам отобразить кнопку возврата на панели инструментов при загрузке фрагмента. И выскочить, когда его щелкнул.

setNavigationOnClickListener для панели инструментов в вашей деятельности.

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(getSupportFragmentManager().getBackStackEntryCount() > 0){ 
       getSupportFragmentManager().popBackStack(); 
      }else { 
       drawer.openDrawer(GravityCompat.START); 
      } 
     } 
    }); 

Внесите FragmentManager.OnBackStackChangedListener в вас Деятельность. И зарегистрировать его SupportFragmentManager в методе OnCreate()

getSupportFragmentManager().addOnBackStackChangedListener(this); 

OnBackStackChangedListener реализации:

@Override 
public void onBackStackChanged() { 
    if(getSupportFragmentManager().getBackStackEntryCount() > 0){ 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    }else { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
     toggle.syncState(); 
    } 
} 
+0

Это единственное решение, которое работает для меня после того, как много борьбы. Спасибо, что поделился! Вызов 'toggle.syncState();' был ключевым фактором, поскольку в противном случае меню гамбургера не будет видно, как только вы вернетесь. –

1

Для меня выше ответа не было достаточно, но я использовал @ Hamz4h_ и добавил еще немного после того, как копаться в ActionBarDrawerToggle класс. Я просто звоню этот метод шахты из OnCreate своей деятельности по:

private void initNavigationElements() { 
    final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, mBinding.drawerLayout, mBinding.appBarMain.toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    mBinding.drawerLayout.addDrawerListener(toggle); 

    // Tricking the toggle by giving it its own arrow as a custom indicator. 
    // It will use it when setDrawerIndicatorEnabled is called with false 
    toggle.setHomeAsUpIndicator(toggle.getDrawerArrowDrawable()); 
    toggle.syncState(); 

    getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      DrawerArrowDrawable drawerArrowDrawable = toggle.getDrawerArrowDrawable(); 
      if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
       // 1 - Display as arrow 
       drawerArrowDrawable.setProgress(1); 
       toggle.setDrawerIndicatorEnabled(false); 

      } else { 
       // 2 - Display as arrow menu 
       drawerArrowDrawable.setProgress(0); 
       toggle.setDrawerIndicatorEnabled(true); 
      } 
     } 
    }); 

    toggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // This is called only when setDrawerIndicatorEnabled is set as false, meaning we are not at the "root" fragment. 
      getSupportFragmentManager().popBackStackImmediate(); 
     } 
    }); 
} 

Надеется, что это поможет кому-то :)

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