使用导航抽屉实现向上按钮操作



问题

我正在使用来自安卓工作室模板的导航抽屉。我想在我的一些片段中使用向上按钮(箭头)来输入"汉堡包"按钮。我使用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);
    }
}

我向Activity::onCreate添加了getSupportActionBar().setHomeButtonEnabled(true);,但是当我按下向上按钮时没有调用onOptionsItemSelected,当我按下菜单项时工作正常。

使用 ActionBar切换 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) {
        }
 });

但是此方法也不会在按下向上按钮时调用。

结论:

那么,我怎样才能赶上向上按钮按下事件呢?

几天前我在某个地方发现了这个......

在我的代码中,我初始化ActionBarDrawerToggle.它有一些构造函数,但我对此感兴趣:

1

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

阿拉伯数字

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

看看:第二个构造函数Toolbar toolbar参数

如果要处理UP BUTTON事件,请不要使用第二个构造器并首先使用。

例:

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。 我们可以覆盖它以在单击向上按钮时调用我们的代码。

嗨,

如果您想拦截操作栏项目,请单击您需要首先将其添加到您的片段中创建:

setHasOptionsMenu(true);

不仅仅是在OptionsItemSelected上使用正确的方法(在活动中使用时片段版本不同):

@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();
    }
}

相关内容

  • 没有找到相关文章

最新更新