Під час використання Навігатора навігації Android розробники рекомендують, що в ActionBar "лише ті екрани, які представлені у Навігаційному ящику, насправді повинні мати зображення Навигаційного ящика", а також, що "всі інші екрани мають традиційну каратність".
Докладні відомості див. Тут: http://youtu.be/F5COhlbpIbY
Я використовую одну діяльність для управління кількома рівнями фрагментів і можу отримати зображення Навигаційного ящика для відображення та функціонування на всіх рівнях.
Під час створення фрагментів нижнього рівня я можу зателефонувати, ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
щоб приховати зображення Навигаційного ящика та відобразити каретку вгору
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag, "lowerFrag").addToBackStack(null).commit();
Проблема, яка виникає у мене, коли я повертаюсь до фрагментів верхнього рівня, все ще відображається карат замість оригінального зображення Навігаційного ящика. Будь-які пропозиції щодо того, як "оновити" ActionBar на фрагментах верхнього рівня, щоб повторно відобразити зображення навігаційного ящика?
Рішення
Пропозиція Тома працювала на мене. Ось що я зробив:
MainActivity
Ця активність контролює всі фрагменти програми.
Готуючи нові фрагменти для заміни інших, я встановив DrawerToggle setDrawerIndicatorEnabled(false)
так:
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag).addToBackStack(null).commit();
Далі, onBackPressed
замінивши setDrawerIndicatorEnabled(true)
це , я повернув це вище, встановивши DrawerToggle таким чином:
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
У фрагментах нижнього рівня
У фрагментах я змінив onCreate
і, onOptionsItemSelected
як це:
В onCreate
додав , setHasOptionsMenu(true)
щоб включити налаштування в меню опцій. Також встановіть setDisplayHomeAsUpEnabled(true)
для включення < на панелі дій:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// needed to indicate that the fragment would
// like to add items to the Options Menu
setHasOptionsMenu(true);
// update the actionbar to show the up carat/affordance
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
Потім, onOptionsItemSelected
коли натискається < , він викликає onBackPressed()
активність для переміщення вгору на один рівень в ієрархії та відображення зображення навігаційного ящика:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Get item selected and deal with it
switch (item.getItemId()) {
case android.R.id.home:
//called when the up affordance/carat in actionbar is pressed
getActivity().onBackPressed();
return true;
…
}
.replace(R.id.frag_layout
. Якщо це ще один рівень ієрархії, я б очікував, що ви .add
це отримаєте в backstack.
theDrawerToggle.setDrawerIndicatorEnabled(false);
посилаєшся на фрагмент всередині? Я думаю, що це задекларовано у файлі класу Основна діяльність. Я не можу знайти спосіб посилання на це. Якісь підказки?
setDisplayOptions()
метод в межах ToolbarWidgetWrapper
(внутрішнього пакета android.support.v7.internal.widget) не відтворить піктограму при введенні того ж фрагмента вдруге. Просто залишаючи це тут, коли інші натрапляють на цю проблему.