Вызов setDisplayHomeAsUpEnabled для фрагментов в ActionBarCompat
Я использую ActionBarCompat. Когда я загружаю дочерний фрагмент, я хочу, чтобы кнопка "Дом" работала как кнопка "вверх". Поэтому я назвал это из дочернего фрагмента:
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Но кнопка дома не отображается как кнопка "вверх". Я также добавил логику для id android.R.id.home
в onOptionsItemSelected
, но она по-прежнему не работает. Любые идеи, как я могу это сделать?
Ответы
Ответ 1
Я боролся с этим в течение нескольких долгих дней, и вот что я нашел для работы. Я надеюсь, что там будет лучшее решение, но это делает работу:
В моей основной деятельности (той, которая запускает фрагмент), создайте следующую публичную функцию, которая будет вызываться дочерним фрагментом:
// The method is in MainActivity.java
public void resetActionBar(boolean childAction, int drawerMode)
{
if (childAction) {
// [Undocumented?] trick to get up button icon to show
drawerToggle.setDrawerIndicatorEnabled(false);
mActionBar.setDisplayHomeAsUpEnabled(true);
} else {
drawerToggle.setDrawerIndicatorEnabled(true);
}
drawerLayout.setDrawerLockMode(drawerMode);
}
Затем из вашего фрагмента, который вы хотите, чтобы кнопка Up появлялась, просто вызовите этот метод следующим образом (при необходимости адаптируйте имена классов):
// This method in in SomeFragment.java
((MainActivity)getActivity()).resetActionBar(true,
DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
Подводя итог, здесь, как включить кнопку из фрагмента:
- Отключить индикатор ящика на объекте drawerToggle - вызов setDrawerIndicatorEnabled (false)
- Установить displayHomeAsUp - вызвать setDisplayHomeAsUpEnable (true) в объекте actionBar
- При необходимости заблокируйте ящик, чтобы он не появлялся при прокрутке края.
Надеюсь, что это поможет, и я надеюсь, что это станет проще в будущем...
Ответ 2
Бит опоздал на сторону:)
Я делюсь этим так, что это может помочь кому-то. У меня есть голова вокруг множества решений, и никто из них не работает отлично. Я использовал варианты решений, доступных в моем проекте, который приведен ниже. Используйте этот код внутри класса, где вы инициализируете панель инструментов и макет ящика.
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);// show back button
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
} else {
//show hamburger
drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
drawerFragment.mDrawerToggle.syncState();
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
drawerFragment.mDrawerLayout.openDrawer(GravityCompat.START);
}
});
}
}
});
Ответ 3
Я ссылался на ответ и принимал такие изменения:
//add third parameter for Fragment
public void resetActionBar(boolean childAction, int drawerMode , final Fragment fragment) {
if (childAction) {
// [Undocumented?] trick to get up button icon to show
actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.mainFrame, fragment);
transaction.commit();
}
});
} else {
actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
}
drawerLayout.setDrawerLockMode(drawerMode);
}
и я вызываю эту функцию в другом фрагменте следующим образом:
//new Homepage it my one of fragments , you can pick up your destination
((MainActivity) getActivity()).resetActionBar(true,DrawerLayout.LOCK_MODE_LOCKED_CLOSED,new HomePage());
Я все еще запутался в вопросе жизненного круга, может ли это помочь вам.
Ответ 4
class ABC : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
**(activity as MainActivity).supportActionBar?.setDisplayHomeAsUpEnabled(false)**
}
}
Ответ 5
Попробуйте это, также не забудьте указать родительскую активность и метаданные для активности в манифесте
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, intent);
// NavUtils.navigateUpFromSameTask(this);
// finish();
return true;
} else {
return super.onOptionsItemSelected(item);
}
}