Панель инструментов 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();
        }
    }
}
Другие вопросы по тегам