【问题标题】:android - Implement UP button action with Navigation Drawerandroid - 使用导航抽屉实现 UP 按钮操作
【发布时间】:2016-03-18 11:59:17
【问题描述】:

问题

我正在使用 Android Studio 模板中的导航抽屉。我想在我的一些片段中使用 UP 按钮(箭头) 并包含 “汉堡”按钮。 我用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) {

        }
 });

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

结论:

那么,我怎样才能捕捉到 Up 按钮按下事件呢?

【问题讨论】:

  • 活动或片段上的向上按钮在哪里??
  • 查看this answer

标签: android android-fragments android-actionbar navigation-drawer up-button


【解决方案1】:

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

在我的代码中,我初始化了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);
}

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

如果您想处理UP BUTTON 事件请勿使用第二个构造函数,请先使用。

例子:

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

getSupportActionBar().setHomeButtonEnabled(true);

setHomeButtonEnabled 很重要,没有这个你不会看到 Hamburger 或 Up 按钮。

【讨论】:

  • setHomeButtonEnabled 对我不起作用。但是setDisplayHomeAsUpEnabled 有效,如果你想显示箭头,记得将isDrawerIndicatorEnabled 设置为false
【解决方案2】:

我在您的方法中添加了几行代码,以便实现后退按钮:

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

【讨论】:

  • 要显示箭头导航而不是抽屉式汉堡包,您只需将 isDrawerIndicatorEnabled 切换为 false
【解决方案3】:

对于使汉堡按钮打开抽屉的默认行为,您可以使用此代码

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

【讨论】:

    【解决方案4】:

    您好,如果您想拦截从片段中单击的操作栏项目,您首先需要将其添加到片段 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
    

    【讨论】:

    • 这不起作用 - 当我按下 UP 按钮时onOptionsItemSelected 不会调用
    【解决方案5】:

    希望对你有所帮助...

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

    【讨论】:

    • 此代码存在于导航抽屉模板中。我在这里实现了从堆栈中弹出片段,但它仅适用于硬件后退按钮,不适用于应用程序栏中的向上按钮
    猜你喜欢
    • 2013-05-20
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多