android - Реализовать действие кнопки UP с помощью Navigation Drawer

Вопрос

Я использую Навигационный ящик из шаблона Android Studio. Я хочу использовать кнопку "ВВЕРХ" (стрелка) в некоторых моих фрагментах вместо кнопки "Гамбургер". я использую AppCompatActivity,

Я использую этот код, чтобы показать кнопку со стрелкой вверх:

public void UseUpButton(boolean value) {
    ActionBar actionBar = getSupportActionBar();
    if (value) {
        actionBar.setDisplayHomeAsUpEnabled(false);
        toggle.setDrawerIndicatorEnabled(false);
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);
    } else {
        toggle.setDrawerIndicatorEnabled(true);
    }
}

Пробные варианты:

Но я не могу поймать нажатие на эту кнопку. Я попробовал несколько способов:

использование onOptionsItemSelected

public boolean onOptionsItemSelected(MenuItem item) {

    Log.d("WTF", "menu");
    switch (item.getItemId())
    {
        case android.R.id.home:
            getFragmentManager().popBackStack();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

я добавить getSupportActionBar().setHomeButtonEnabled(true); к моему Activity::onCreate, но onOptionsItemSelected не вызывается при нажатии кнопки "Вверх" и работает правильно при нажатии элементов меню.

Используйте ActionBarToggle OnClickListener

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();
toggle.setToolbarNavigationClickListener(new View.OnClickListener()
{
        @Override
        public void onClick(View v) {

        }
 });

Но этот метод не вызывает при нажатии кнопки "Вверх".

Заключение:

Итак, как я могу поймать событие нажатия кнопки вверх?

5 ответов

Решение

Я нашел это где-то несколько дней назад...

В моем коде я инициализирую ActionBarDrawerToggle, У него есть несколько конструкторов, но я заинтересован в этом:

1

public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,
        @StringRes int openDrawerContentDescRes,
        @StringRes int closeDrawerContentDescRes) {
    this(activity, null, drawerLayout, null, openDrawerContentDescRes,
            closeDrawerContentDescRes);
}

2

public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,
        Toolbar toolbar, @StringRes int openDrawerContentDescRes,
        @StringRes int closeDrawerContentDescRes) {
    this(activity, toolbar, drawerLayout, null, openDrawerContentDescRes,
            closeDrawerContentDescRes);
}

Посмотрите: 2-й конструктор имеет Toolbar toolbar аргумент.

Если вы хотите справиться UP BUTTON события НЕ ИСПОЛЬЗУЙТЕ 2-го КОНСТРУКТОРА и используйте сначала.

Пример:

toggle = new ActionBarDrawerToggle(
            this,
            drawer,
            R.string.navigation_drawer_open,
            R.string.navigation_drawer_close);

getSupportActionBar().setHomeButtonEnabled(true);

setHomeButtonEnabled важно, без этого вы не увидите кнопку "Гамбургер" или "Вверх".

Я добавил несколько строк в ваш метод, чтобы он реализовал кнопку возврата:

  public void useUpButton(boolean value) {
    ActionBar actionBar = getSupportActionBar();
    if (value) {
        actionBar.setDisplayHomeAsUpEnabled(false);
        toggle.setDrawerIndicatorEnabled(false);
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);
        toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    } else {
        toggle.setDrawerIndicatorEnabled(true);
        toggle.setToolbarNavigationClickListener(null);
    }
}

Для поведения по умолчанию, которое делает ящик гамбургера открытым, вы можете просто использовать этот код

    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);

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

затем, чтобы переопределить поведение по умолчанию в любом из дочерних действий, сделайте это

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);  // shows the up navigation button instead of the hamburger

    mToolbar.setNavigationOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            finish(); //end current activity
        }
    });

Когда ActionBarDrawerToggle принимает панель инструментов в качестве входных данных, он устанавливает свой собственный NavigationOnClickListener на панели инструментов. мы можем переопределить это, чтобы вызвать наш код при нажатии кнопки вверх.

Привет. Если вы хотите перехватить элементы панели действий, щелкните по фрагменту, который вам нужен, и сначала добавьте его в свой фрагмент onCreate:

setHasOptionsMenu(true);

Чем просто использовать правильный метод onOptionsItemSelected (версия фрагмента отличается при использовании в действии):

@Override public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.your_action:
                //do something
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }//onOptionsItemSelected

Надеюсь, это поможет вам...

DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);//for fragment
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        //do samething
    }
}

или используйте это

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);//for fragment
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        finish();
    }
}
Другие вопросы по тегам