我有一个简单的android.support.v7.widget.Toolbar
,我要做的就是按下" hamburger"打开一个NavigationDrawer。左上角的图标。 "汉堡"按钮是可见的,当我从左侧开始拉动时,我看到按钮上的动画,但按下按钮不会像我期望的那样打开/关闭NavigationDrawer。我已经关注[Google文档] [1]但仍无法解决这个问题。很抱歉任何混淆,下面是我目前正在尝试使用的简化代码:
public class MainActivity extends AppCompatActivity implements
View.OnClickListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("NICK", "button button button..................");
}
});
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
NavigationView n = (NavigationView) findViewById(R.id.nav);
mDrawerLayout.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.d("NICK", "button button button..................");
}
});
//mDrawerLayout.setDrawerListener(mDrawerToggle);
n.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
////.......
}
mDrawerLayout.closeDrawers(); // CLOSE DRAWER
return true;
}
});
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d("NICK","CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO");
switch (item.getItemId()) {
case android.R.id.home:
mDrawerLayout.openDrawer(GravityCompat.START); // OPEN DRAWER
Log.d("NICK","CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO");
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.drawer, menu);
return true;
}
}
}
因为我在运行时没有得到任何日志调试语句。
这基本上是我的问题:https://stackoverflow.com/a/26636045/1489990。我已经遵循了这一点,它只是没有用。
我的理解是,当按下汉堡包图标时调用setNavigationOnClickListener
,这是我关注的地方我的努力是让事件处理得当,因为当我按下按钮我没有得到我的日志声明。如果这个想法不正确,请告诉我。 https://developer.android.com/reference/android/widget/Toolbar.html#setNavigationOnClickListener(android.view.View.OnClickListener)
我的布局:
ActivityMain.xml
<RelativeLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/d"
android:background="@drawable/home_wall">
<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:layout_marginBottom="10dp"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:layout_marginTop="25dp"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" />
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:id="@+id/drawer"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<ImageView
android:layout_width="fill_parent"
android:layout_height="200dp"
android:id="@+id/imageView"
android:src="@drawable/trans2"
android:layout_alignParentTop="true"
android:layout_marginTop="10dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:paddingBottom="300dp" />
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/d8"
android:layout_alignParentTop="true"
android:layout_alignLeft="@+id/imageView"
android:layout_alignStart="@+id/imageView"
android:paddingTop="0dp">
<Button
android:layout_width="75dp"
android:layout_height="50dp"
android:text="Gallery"
android:id="@+id/save_button"
android:background="#dd2c00" android:textColor="#fff"
android:layout_below="@+id/Purchases"
android:layout_toRightOf="@+id/start_button"
android:layout_toEndOf="@+id/start_button" />
<Button
android:layout_width="125dp"
android:layout_height="50dp"
android:text="Store"
android:id="@+id/Purchases"
android:background="#ff6e40" android:textColor="#fff"
android:layout_above="@+id/instructions_button6"
android:layout_toLeftOf="@+id/start_button"
android:layout_toStartOf="@+id/start_button"
android:layout_marginBottom="98dp" />
<Button
android:layout_width="75dp"
android:layout_height="50dp"
android:text="Help"
android:id="@+id/instructions_button6"
android:background="#dd2c00" android:textColor="#fff"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@+id/start_button"
android:layout_toStartOf="@+id/start_button"
android:layout_marginLeft="5dp"
android:layout_marginBottom="10dp" />
<Button
android:layout_width="75dp"
android:layout_height="300dp"
android:text="Start"
android:id="@+id/start_button"
android:background="#ff3d00"
android:textColor="#fff"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="10dp" />
<Button
android:layout_width="125dp"
android:layout_height="50dp"
android:text="Achievements"
android:id="@+id/Scores"
android:background="#ff6e40" android:textColor="#fff"
android:layout_alignTop="@+id/Purchases"
android:layout_toRightOf="@+id/start_button"
android:layout_toEndOf="@+id/start_button" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Welcome to the quiz!"
android:id="@+id/textView"
android:textColor="#fff"
android:textSize="20dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="70dp" />
<!-- sign-in button -->
<com.google.android.gms.common.SignInButton
android:id="@+id/sign_in_button"
android:layout_width="110dp"
android:layout_height="50dp"
android:layout_above="@+id/start_button"
android:layout_centerHorizontal="true"
android:visibility="visible" />
<!-- sign-out button -->
<Button
android:id="@+id/sign_out_button"
android:layout_width="125dp"
android:layout_height="wrap_content"
android:text="Sign Out"
android:visibility="invisible"
android:background="#dd4b39"
android:textColor="#fff"
android:layout_alignTop="@+id/sign_in_button"
android:layout_centerHorizontal="true"
android:layout_marginTop="160dp" />
</RelativeLayout>
<android.support.design.widget.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#fff"
android:id="@+id/nav"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/drawer"/>
</android.support.v4.widget.DrawerLayout>
Drawer.xml
:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_menu"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:title="Google Play Games"
android:icon="@drawable/ic_local_airport_white_48dp">
<menu>
<item
android:id="@+id/Sign_in_drawer"
android:icon="@drawable/games_controller_grey"
android:title="Sign in" />
<item
android:id="@+id/ach"
android:icon="@drawable/games_achievements"
android:title="Achievements" />
</menu>
</item>
<item android:title="Start a Quiz"
android:icon="@drawable/ic_local_airport_white_48dp">
<menu>
<item
android:id="@+id/quizStart25"
android:icon="@drawable/ic_local_airport_white_48dp"
android:title="25 Questions" />
<item
android:id="@+id/quizStart10"
android:icon="@drawable/ic_local_airport_white_48dp"
android:title="10 Questions" />
</menu>
</item>
<group
android:checkableBehavior="single">
<item
android:id="@+id/gallery"
android:icon="@drawable/ic_photo_library_white_48dp"
android:title="Gallery" />
<item
android:id="@+id/stats"
android:icon="@drawable/ic_toc_white_48dp"
android:title="Statistics" />
<item
android:id="@+id/store"
android:icon="@drawable/ic_shop_white_48dp"
android:title="Store" />
<item
android:id="@+id/settings"
android:icon="@drawable/ic_settings_white_48dp"
android:title="Settings" />
<item
android:id="@+id/about"
android:icon="@drawable/ic_info_white_48dp"
android:title="About" />
</group>
<item android:title="Support">
<menu>
<item
android:id="@+id/help_drawer"
android:icon="@drawable/ic_help_white_48dp"
android:title="Help" />
<item
android:id="@+id/report"
android:icon="@drawable/ic_report_problem_white_48dp"
android:title="Contact Developer" />
<item
android:id="@+id/GPlusCommunity"
android:icon="@drawable/btn_g_white_normal"
android:title="Google+ Community" />
</menu>
</item>
答案 0 :(得分:89)
在ActivityMain.xml中,工具栏位于DrawerLayout之外。这就是问题所在。如果您希望工具栏与DrawLayout交互,工具栏必须是DrawerLayout的子项。
要解决此问题,请将DrawerLayout作为活动的根目录。这是documentation。相关的引用是:
要添加导航抽屉,请使用a声明您的用户界面 DrawerLayout对象作为布局的根视图。在 - 的里面 DrawerLayout,添加一个包含主要内容的视图 屏幕(隐藏抽屉时的主要布局)和另一个 包含导航抽屉内容的视图。
基本上,将ActivityMain.xml构造成如下所示:
<android.support.v4.widget.DrawerLayout ...>
<RelativeLayout ...>
<android.support.v7.widget.Toolbar .../>
<!-- Your other content goes here -->
</RelativeLayout>
<android.support.design.widget.NavigationView .../>
</android.support.v4.widget.DrawerLayout>
那应该解决这个问题。
答案 1 :(得分:8)
您需要同步抽屉切换:
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
编辑:该代码对我有用(从帖子中复制)
public class TempActivity extends AppCompatActivity {
private ActionBarDrawerToggle mDrawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.temp);
setupDrawer();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
private void setupDrawer() {
Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.my_drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
}
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<RelativeLayout
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFF"
android:text="DRAMER MENU" />
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
但是如果您使用新的NavigationView
,那么您就不需要切换等Here is a good example如何使用它。
答案 2 :(得分:7)
覆盖onOptionsItemSelected
方法并使用以下
if(item.getItemId() == android.R.id.home){ // use android.R.id
mDrawerLayout.openDrawer(Gravity.LEFT);
}
答案 3 :(得分:1)
对于抽屉切换,您需要将“display home as up”设置为false:
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
答案 4 :(得分:1)
由于我对你的问题没有具体的答案,我想提出一个完全不同的方法:
在我的项目中使用Mike Penz开发的Material Drawer。 它看起来非常好,易于实现,你不必担心。
因此,如果您无法找到问题的解决方案,可以尝试一下。
答案 5 :(得分:1)
使用ActionBarDrawerToggle
并实施public boolean onOptionsItemSelected(MenuItem item)
工具栏不必在DrawerLayout中,它不可能是导致此问题的原因。 toggle.onOptionsItemSelected(item)
查找所选项目的ID,如果是android.R.id.home
,则切换抽屉的可见性。因此,工具栏或任何创建Home MenuItem的视图都可以放置在布局中的任何位置。
在您的活动中:
ActionBarDrawerToggle toggle;
private void setupDrawerToggleInActionBar() {
// assuming a Toolbar has been initialized in your onCreate
this.setSupportActionBar(toolbar);
// setup the action bar properties that give us a hamburger menu
ActionBar actionBar = this.getSupportActionBar();
if(actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
}
// the toggle allows for the simplest of open/close handling
toggle = new ActionBarDrawerToggle(this,
drawerLayout,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
// drawerListener must be set before syncState is called
drawerLayout.setDrawerListener(toggle);
toggle.setDrawerIndicatorEnabled(true);
toggle.syncState();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// This is required to make the drawer toggle work
if(toggle.onOptionsItemSelected(item)) {
return true;
}
/*
* if you have other menu items in your activity/toolbar
* handle them here and return true
*/
return super.onOptionsItemSelected(item);
}
答案 6 :(得分:1)
只需在活动选项菜单管理功能上调用ActionBarDrawerToggle类的函数onOptionsItemSelected(MenuItem menuItem),如下所示。
mDrawerToggle= new ActionBarDrawerToggle(activity, drawerLayout, R.string.nav_drawer_accessbility_drawer_open,
R.string.nav_drawer_accessbility_drawer_close);
@Override
public boolean onOptionsItemSelected(final android.view.MenuItem item) {
navigation().getOptionsMenuInflater(this).closeSearchView();
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this behavior.
mDrawerToggle.onOptionsItemSelected(item);
return super.onOptionsItemSelected(item);
}
OR
覆盖onOptionsItemSelected活动,如下所示
public boolean onOptionsItemSelected(MenuItem item) {
if (item != null && item.getItemId() == android.R.id.home) {
toggle();
}
return super.onOptionsItemSelected(item);
}
private void toggle() {
if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
mDrawerLayout.openDrawer(GravityCompat.START);
}
}
答案 7 :(得分:1)
如果它对某人有帮助,对我来说也是如此,因为两次调用setSupportActionBar(toolbar)
的愚蠢错误。只需在onCreate方法中调用一次,再也不要。我的错误是我后来用另一种方法调用它。
答案 8 :(得分:1)
我通过将NavigatorLayout的openable设置为openable来修复了该问题。
更多信息navigateUp Doc
override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.host_fragment)
return NavigationUI.navigateUp(navController,drawer_layout)
}
答案 9 :(得分:0)
虽然这里接受的答案可行,但正如他们所说“预防胜于治疗”。添加mDrawerToggle.syncState(); inPostCreate和onConfigurationChanged()在上面的@mbmc中回答得更好:
a[i]
答案 10 :(得分:0)
在遇到许多不同的问题后,我找到了一种使之工作的方法,即将工具栏小部件放入AppBarLayout中。
请确保小部件工具栏顶部没有其他布局!
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawable_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
xmlns:android="http://schemas.android.com/apk/res/android">**
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_page_toolbar"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>**
.... YOUR LAYOUT ...
</RelativeLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:layout_marginBottom="3dp"
app:menu="@menu/navigation_menu">
</com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>
答案 11 :(得分:0)
Idk为什么...但是将返回值更改为false而不是true可以为我修复ham图标。 on onOptionItemSelected覆盖方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
if(item.getItemId() == R.id.logout){
ParseUser.logOut();
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
Toast.makeText(this, "Logout Successful!", Toast.LENGTH_SHORT).show();
} else if(item.getItemId() == R.id.action_settings){
Toast.makeText(this, "No setting to update! Will be available later...", Toast.LENGTH_SHORT).show();
}
return true; // here change this to false
}
答案 12 :(得分:0)
如果以上答案均无效,请再次进行交叉检查,
首先,您需要调用setSupportActionBar(toolbar);然后为导航抽屉做必要的工作。由于这个愚蠢的错误,我浪费了2个小时。
答案 13 :(得分:0)
我遇到了同样的问题。然而,它并没有出现在所有片段上。它发生在一个特定的片段上。
首先,请遵循上面提到的@hungryghost 的回答。然后执行以下操作。 添加以下代码有助于在单击汉堡包图标时打开抽屉。它对我来说完美无缺。非常感谢你。 :) 如果这不是正确的方式,我深表歉意。
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
if(itemId == android.R.id.home){
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}