Панель инструментов setNavigationOnClickListener нарушает функциональность ActionbarDrawerToggle
Я заменяю панель действий для панели инструментов, и у меня почти все кусочки головоломки на месте. Моя проблема, в частности, если я перемещаюсь вверх и восстанавливаю навигационную панель, кнопка переключения больше не работает. Я понял, что если установить режим ящика разблокированным, у меня есть возможность провести, чтобы открыть ящик, но я не могу щелкнуть, чтобы открыть ящик.
Таким образом, я загружаю фрагмент A, поведение ящика в порядке, спускаюсь к фрагменту B и применяю значок вверх, нажимаю вверх, чтобы вернуться к A, и ящик больше не открывается щелчком.
Ввод фрагмента Б:
Toolbar t = mHostingActivity.getToolbar();
mHostingActivity.getDrawerToggle().setDrawerIndicatorEnabled(false);
mHostingActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
t.setNavigationIcon(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator());
t.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popBackStackToTop(mHostingActivity);
}
});
/**
* Pop the back stack and hide the Up caret all the way to the top level of the {@link com.loylap.activities.MainActivity}
*
* @param activity our hosting activity
*/
public static void popBackStackToTop(MainActivity activity) {
if (activity != null) {
FragmentManager fm = activity.getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
activity.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
activity.getDrawerToggle().setDrawerIndicatorEnabled(true);
}
}
Панель навигации настроена так же, как образец, может быть, проблема заключается в старом способе настройки параметров? Например, у меня все еще есть это в моей деятельности:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
РЕДАКТИРОВАТЬ:
Итак, я сузил проблему до setNavigationOnClickListener(). Если я не установлю это (и поднимаюсь через кнопку возврата) - ящик ведет себя правильно. Итак, теперь вопрос заключается в том, как правильно разрешить пользователю перейти "вверх" и восстановить прослушиватель щелчков после того, как мы поднимемся?
5 ответов
Итак, я понял, что создаю неправильный слушатель щелчков. Вместо setNavigationOnClickListener() мне нужно установить setToolbarNavigationClickListener ():)
Тонкое, но важное изменение, теперь панель инструментов ведет себя в партнерстве с v7 ActionBarDrawerToggle
/**
* Create the Up caret for a lower level fragment {@link com.loylap.activities.MainActivity}
*
* @param activity our hosting activity
*/
public static void createUpButton(final MainActivity activity)
{
ActionBarDrawerToggle toggle = activity.getDrawerToggle();
//Disables onClick toggle listener (onClick)
toggle.setDrawerIndicatorEnabled(false);
toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popBackStackToTop(activity);
}
});
Toolbar t = activity.getToolbar();
t.setNavigationIcon(activity.getV7DrawerToggleDelegate().getThemeUpIndicator());
activity.getDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
В моем случае это был вопрос порядка, мне сначала нужно было установить панель инструментов, а затем установить прослушиватель при нажатии. в этом порядке:
//works
setSupportActionBar(myToolbar);
myToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openDrawer(view);
}
});
а не это:
//doesn't work
myToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openDrawer(view);
}
});
setSupportActionBar(myToolbar);
Вдохновленный решением Даниэля Уилсона, но вы должны сделать это только один раз, и все готово.
В моем NavigationDrawer
"s setUp()
(или вы можете сделать это везде, где вы инициализируете ActionBarDrawerToggle
например), я пишу этот код:
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!mDrawerToggle.isDrawerIndicatorEnabled()) {
getActivity().onBackPressed();
}
}
});
Теперь каждый раз android.id.home
нажата и знак гамбургера не отображается, родительская активность onBackPressed()
называется.
Я думаю, что вы не можете использовать:
t.setNavigationIcon(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator());
t.setNavigationOnClickListener(new View.OnClickListener() ...
потому что это нарушит ваше нормальное поведение навигационной панели.
Вместо этого попробуйте что-то вроде этого в onCreateOptionsMenu(меню Menu, MenuInflater inflater):
mHostingActivity.getDrawerToggle().setDrawerIndicatorEnabled(false);
mHostingActivity.getDrawerToggle().setHomeAsUpIndicator(mHostingActivity.getV7DrawerToggleDelegate().getThemeUpIndicator());
а затем в onOptionsItemSelected
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
popBackStackToTop(mHostingActivity);
return true;
default:
break;
}
return false;
}
PS: не забудьте использовать setHasOptionsMenu(true); в вашем фрагменте onCreateView.
Для анимации мы можем использовать.
ValueAnimator drawerAnimator = ValueAnimator.ofFloat(Constants.HAMBURGER, Constants.BACK);
drawerAnimator.addUpdateListener(drawerAnimationUpdateListener);
drawerAnimator.setDuration(Constants.DRAWER_ANIMATION_DURATION);
drawerAnimator.setInterpolator(new LinearInterpolator());
передайте действие 0 для значка ГАМБУРГЕР и 1 для НАЗАД.
public void updateNavigationDrawer(int action) {
drawerArrowDrawable = actionBarDrawerToggle.getDrawerArrowDrawable();
if (action == Constants.BACK) {
actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
actionBarDrawerToggle.setHomeAsUpIndicator(drawerArrowDrawable);
actionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//onBackPress();
}
});
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED););
} else {
actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
if (drawerArrowDrawable.getProgress() != action) {
if (action == Constants.BACK) {
drawerAnimator.start();
} else {
drawerAnimator.reverse();
}
}
}