【问题标题】:Toolbar's up caret opens nav menu工具栏的向上插入符号打开导航菜单
【发布时间】:2016-03-17 07:20:51
【问题描述】:

我在我的应用程序中使用 v7.widget.Toolbar,但我得到了一些时髦的功能。我有我的主要活动和放置在它上面的片段。当 backStack 上没有碎片时,汉堡按钮显示并且菜单正常工作。当我将片段添加到 backStack 时,向上插入符号正确显示,但是当我单击向上插入符号时,导航菜单打开而不是片段从堆栈中弹出。

现在,如果有一个真正的答案,我会接受它,但在这一点上,我会采用一个骇人听闻的解决方案。我尝试添加一个监听器,这样我就知道何时点击了操作栏按钮,但这只是让片段弹出,页面返回,但导航菜单仍然打开。 onOptionsItemSelected 没有被调用(由于我实现 Drawer Toggle 的方式,但是以“正确”的方式执行它给我带来了更多问题,例如主页上根本没有显示导航菜单)。

为了清楚起见总结一下:向上插入符号是打开导航菜单,而不是返回。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTitle = getTitle();
    toolbar = (Toolbar) findViewById(R.id.tool_bar); // Attaching the layout to the toolbar object
    frameLayout = (FrameLayout) findViewById(R.id.frame_layout);
    setSupportActionBar(toolbar);

    //Listen for changes in the back stack
    getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            shouldDisplayHomeUp();
        }
    });

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerContent = findViewById(R.id.drawer_content);
    mDrawerList = (ListView) findViewById(R.id.drawer_list);

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
    mDrawerList.setAdapter(new DrawerListItemAdapter(DRAWER_ITEMS, getApplicationContext()));

    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.openDrawer, R.string.closeDrawer) {

        public void onDrawerClosed(View view) {
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            Log.d("Main", "Open Menu");
        }

    };
    mDrawerToggle.syncState();
    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

    @Override
public void onBackStackChanged() {
    shouldDisplayHomeUp();
}

public void shouldDisplayHomeUp(){
    //Enable Up button only if there are entries in the back stack
    boolean canback = getSupportFragmentManager().getBackStackEntryCount()>0;
    ActionBar ab = getSupportActionBar();
    if(ab != null){
        ab.setDisplayHomeAsUpEnabled(canback);
    }
    if(!canback){
        //App can crash as mDrawerToggle will be null when app launches
        try{
            mDrawerToggle.syncState();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    Log.d("Main", "shouldDisplayHomeUp");
}

@Override
public boolean onSupportNavigateUp() {
    //This method is called when the up button is pressed. Just the pop back stack.
    Log.d("Main", "Up carat pressed");
    getSupportFragmentManager().popBackStack();
    return true;
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggls
    mDrawerToggle.onConfigurationChanged(newConfig);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();
    Log.d("Main", "Menu item clicked: " + Integer.toString(item.getItemId()));
    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

适合我的解决方案

下面 Alex 的回答(包括他在回答中的评论)和 this hacky answer 的组合。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    您可以使用setToolbarNavigationClickListener() - 它设置在抽屉指示器被禁用时处理点击的监听器

    drawerToggle.setToolbarNavigationClickListener((View view) -> {
            getSupportFragmentManager().popBackStack();
        });
    

    【讨论】:

    • mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("Main", "setToolbarNavClickListener"); getSupportFragmentManager().popBackStack(); } }); 是我所做的,但它从未被调用过。不在带有正确导航菜单的主屏幕或带有向上插入符号的片段深度屏幕上。
    • 监听器仅在您使用 mDrawerToggle.setDrawerIndicatorEnabled(boolean) 时才有效 - 试试这个而不是 ab.setDisplayHomeAsUpEnabled(canback);
    • 某些页面上不显示向上插入符号,但当它出现时,它可以正常工作。我称之为进步。如果我弄清楚如何让它在所有页面上显示,我会回帖。我目前只有“setDisplayHomeAsUpEnabled()”之前的“setDrawerIndicatorEnabled()”方法。
    猜你喜欢
    • 2019-10-03
    • 2018-07-12
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多