【问题标题】:Can not open NavigationDrawer from Toolbar Menu Items android无法从工具栏菜单项 android 打开 NavigationDrawer
【发布时间】:2015-09-26 14:26:19
【问题描述】:

您好,我尝试使用本教程在 android 中制作 NavigationDrawer,但我不想更改 Drawer 的打开方式。教程是这样的: http://www.androidhive.info/2015/04/android-getting-started-with-material-design/

在本教程中,抽屉使用工具栏中的默认主页按钮打开,我想使用菜单项打开它。

这是我的主要代码:

public class First_page extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener  {

    Button go_layout;
    private Toolbar toolbar;
    private FragmentDrawer drawerFragment;

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

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

        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayUseLogoEnabled(true);
        getSupportActionBar().setLogo(R.drawable.page_logo_2);

        drawerFragment = (FragmentDrawer)
                getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
        drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);
        drawerFragment.setDrawerListener(this);

        go_layout = (Button)findViewById(R.id.go_to_page);

        go_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(First_page.this, Full_page.class);
                startActivity(intent);

            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.right_btn) {


            Toast.makeText(First_page.this, "Right_btn clicked", Toast.LENGTH_LONG).show();

            drawerFragment = (FragmentDrawer)
                    getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
            drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);
            drawerFragment.setDrawerListener(this);

        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onDrawerItemSelected(View view, int position) {

    }
}

【问题讨论】:

    标签: android android-toolbar navigation-drawer


    【解决方案1】:

    以下是我如何处理 NavigationDrawer 的打开和关闭。只需在您想要打开或关闭它的地方调用 handleNavDrawer() 即可。

    处理抽屉的打开和关闭

    public void handleNavDrawer() {
        if (mNavigationDrawer.isDrawerOpen(GravityCompat.START)) {
            mNavigationDrawer.closeDrawer(GravityCompat.START);
        } else {
            mNavigationDrawer.openDrawer(GravityCompat.START);
        }
    }
    

    工作示例

    public class MainActivity extends AppCompatActivity {
    
        private DrawerLayout mNavigationDrawer;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_tracker);
            mNavigationDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == R.id.action_search) { 
                handleNavDrawer();
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    
        public void handleNavDrawer() {
            if (mNavigationDrawer.isDrawerOpen(GravityCompat.START)) {
                mNavigationDrawer.closeDrawer(GravityCompat.START);
            } else {
                mNavigationDrawer.openDrawer(GravityCompat.START);
            }
        }
    }
    

    更新你的例子

    public class First_page extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener  {
    
        Button go_layout;
        private Toolbar toolbar;
        private FragmentDrawer drawerFragment;
        private DrawerLayout mNavigationDrawer;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_first_page);
    
            toolbar = (Toolbar)findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayShowTitleEnabled(false);
            getSupportActionBar().setHomeButtonEnabled(true);
            getSupportActionBar().setDisplayUseLogoEnabled(true);
            getSupportActionBar().setLogo(R.drawable.page_logo_2);
    
            go_layout = (Button)findViewById(R.id.go_to_page);
            go_layout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(First_page.this, Full_page.class);
                    startActivity(intent);
    
                }
            });
            mNavigationDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            drawerFragment = (FragmentDrawer) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
            drawerFragment.setUp(R.id.fragment_navigation_drawer, mNavigationDrawer, toolbar);
            drawerFragment.setDrawerListener(this);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == R.id.right_btn) {
                Toast.makeText(First_page.this, "Right_btn clicked", Toast.LENGTH_LONG).show();
                handleNavDrawer();
            }
            return super.onOptionsItemSelected(item);
        }
    
        @Override
        public void onDrawerItemSelected(View view, int position) {
        // Close the Nav Drawer
        // handleNavDrawer();
        }
    
        public void handleNavDrawer() {
            if (mNavigationDrawer.isDrawerOpen(GravityCompat.START)) {
                mNavigationDrawer.closeDrawer(GravityCompat.START);
            } else {
                mNavigationDrawer.openDrawer(GravityCompat.START);
            }
        }
    }
    

    【讨论】:

    • 感谢您的帮助,但正如我所说,我正在使用发布活动代码的教程。实际上,该教程不使用 DrawerLayout。我发布我的代码。
    • 它正在使用 DrawerLayout。您只需要在 onCreate 中调用 DrawerLayout 并放入我添加的内容。我建议不要使用您正在使用的示例。我会用你所拥有的更新我的答案,但会考虑使用 NavigationView。
    • 刚刚更新了我的答案,在 onCreate 中调用了 DrawerLayout。
    • 完美工作。非常感谢。
    • 没问题!祝你好运!
    【解决方案2】:

    我的方法是一个名为 "btnClickSideBar" 的 onClick。你可以随心所欲地称呼它。 当您单击时,它将检查抽屉是打开还是关闭。如果是 Open,我们的方法将关闭,如果是关闭,抽屉将打开。

    public void btnClickSideBar(View view) {
    
                    if (drawerLayout.isDrawerOpen(drawerContainer)) {
                        drawerLayout.closeDrawers();
                    } else {
                        drawerLayout.openDrawer(drawerContainer);
                    }
                }
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多