导航抽屉打开时,工具栏按钮不响应触摸

问题描述:

我正在使用appcompat v7库对我的应用程序的材质设计版本进行操作,并且导航抽屉遇到了问题。打开时,材质设计工具栏中的按钮停止工作 - 导航抽屉外的任何触摸都会关闭抽屉。接下来的是我的意思导航抽屉打开时,工具栏按钮不响应触摸

the gif http://images.rymate.co.uk/images/83JXi1X.png

这里,GIF是我使用该活动的XML布局:

<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/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <!-- The main content view --> 
    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/action_toolbar" 
      android:layout_height="wrap_content" 
      android:layout_width="match_parent" 
      android:minHeight="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
      android:elevation="4dp" 
      /> 

     <FrameLayout 
      android:id="@+id/note_list_container" 
      android:layout_marginTop="?attr/actionBarSize" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

     <net.rymate.notes.ui.FloatingActionButton 
      android:id="@+id/fabbutton" 
      android:layout_width="72dp" 
      android:layout_height="72dp" 
      android:layout_gravity="bottom|right" 
      android:layout_marginBottom="16dp" 
      android:layout_marginRight="16dp" /> 
    </FrameLayout> 
    <!-- The navigation drawer --> 
    <LinearLayout 
     android:id="@+id/left_drawer" 
     android:layout_width="300dp" 
     android:layout_marginTop="?attr/actionBarSize" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:orientation="vertical"> 

     <ListView 
      android:id="@+id/cat_list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:choiceMode="singleChoice" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="0dp" 
      android:background="?catBackColour" /> 
    </LinearLayout> 

</android.support.v4.widget.DrawerLayout> 

这里是onCreate代码初始化抽屉和工具栏。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ROBOTO_LIGHT = Typeface.createFromAsset(this.getAssets(), "Roboto-Light.ttf"); 
    ROBOTO_LIGHT_ITALICS = Typeface.createFromAsset(this.getAssets(), "Roboto-LightItalic.ttf"); 

    setContentView(R.layout.activity_notes); 

    if (findViewById(R.id.note_container) != null) { 
     // The detail container view will be present only in the 
     // large-screen layouts (res/values-large and 
     // res/values-sw600dp). If this view is present, then the 
     // activity should be in two-pane mode. 
     mTwoPane = true; 

     // In two-pane mode, list items should be given the 
     // 'activated' state when touched. 
     FragmentManager fm = getSupportFragmentManager(); 
     //list.setActivateOnItemClick(true); 
    } 


    if (!mTwoPane) { 
     final FloatingActionButton mFab = (FloatingActionButton) findViewById(R.id.fabbutton); 
     mFab.init(Color.parseColor("#1e90ff")); 
     mFab.setFabDrawable(getResources().getDrawable(R.drawable.ic_action_new)); 
     mFab.showFab(); 

     mFab.setOnClickListener(this); 

     list = new NotesListFragment(mFab); 
    } else { 
     list = new NotesListFragment(); 
    } 


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

    getSupportFragmentManager().beginTransaction() 
      .replace(R.id.note_list_container, list) 
      .commit(); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); // the layout 
    mDrawerLinear = (LinearLayout) findViewById(R.id.left_drawer); 

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    getSupportActionBar().setHomeButtonEnabled(true); 

    mDrawerLayout.setScrimColor(getResources().getColor(android.R.color.transparent)); 

    mDrawerToggle = new ActionBarDrawerToggle(
      this,     /* host Activity */ 
      mDrawerLayout,   /* DrawerLayout object */ 
      toolbar, /* toolbar */ 
      R.string.drawer_open, /* "open drawer" description */ 
      R.string.drawer_close /* "close drawer" description */ 
    ) { 

     /** Called when a drawer has settled in a completely closed state. */ 
     public void onDrawerClosed(View view) { 
      getSupportActionBar().setTitle("Rymate Notes"); 
      supportInvalidateOptionsMenu(); 
     } 

     /** Called when a drawer has settled in a completely open state. */ 
     public void onDrawerOpened(View drawerView) { 
      getSupportActionBar().setTitle("Categories"); 
      supportInvalidateOptionsMenu(); 
     } 
    }; 

    // Set the drawer toggle as the DrawerListener 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    pref = getSharedPreferences("rymatenotesprefs", MODE_PRIVATE); 

    mDrawerList = (ListView) findViewById(R.id.cat_list); 

    mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

    mDbHelper = new NotesDbAdapter(this); 
    mDbHelper.open(); 

    if (mDbHelper.fetchAllNotes().getCount() == 0) { 
     IntroFragment fragment = new IntroFragment(); 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.note_list_container, fragment) 
       .commit(); 

    } 

    getCategories(); // calls a function which populates the listview 

} 

有没有办法解决这个问题?

+1

材料设计规范指出,导航抽屉应位于工具栏上并位于状态栏下方,在这种情况下,该按钮的行为没有响应是非常有意义的。看看这里:http://www.google.com/design/spec/patterns/navigation-drawer.html – 2014-11-10 09:24:49

结果Nikola Despotoski有正确的想法 - 触摸事件被DrawerLayout窃取。然而,而不是拦截的触摸事件我只是调整了活动布局像这样:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/action_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="?attr/colorPrimary" 
     android:elevation="4dp" 
     android:minHeight="?attr/actionBarSize" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
     app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> 

    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="?attr/actionBarSize" > 

     <!-- The main content view --> 
     <FrameLayout 
      android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <FrameLayout 
       android:id="@+id/note_list_container" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"/> 

      <net.rymate.notes.ui.FloatingActionButton 
       android:id="@+id/fabbutton" 
       android:layout_width="72dp" 
       android:layout_height="72dp" 
       android:layout_gravity="bottom|right" 
       android:layout_marginBottom="16dp" 
       android:layout_marginRight="16dp" /> 
     </FrameLayout> 
     <!-- The navigation drawer --> 
     <LinearLayout 
      android:id="@+id/left_drawer" 
      android:layout_width="300dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      android:orientation="vertical"> 

      <ListView 
       android:id="@+id/cat_list" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="?catBackColour" 
       android:choiceMode="singleChoice" 
       android:divider="@android:color/transparent" 
       android:dividerHeight="0dp" /> 
     </LinearLayout> 

    </android.support.v4.widget.DrawerLayout> 
</FrameLayout> 

这样具有允许触摸事件由Toolbar而非DrawerLayout注册的预期效果。

+10

,所以你写了一个基于别人的建议,你自己的问题的答案,然后接受自己的答案?甚至没有赞成或接受他的回答? – VipulKumar 2014-11-12 08:22:14

+0

很难理解布局中的哪个变化使抽屉停止拦截工具栏中的触摸事件... – Marek 2015-10-21 18:02:23

似乎触摸事件由出票人的影子被盗,即DrawerLayout保持拦截触摸事件,因为Toolbar是内容视图的一部分,不像ActionBar正对装饰视图的顶部。

可能的解决办法是拦截触摸事件:

如果S之间0(顶部)和Toolbar高度(底部),直接分派事件到Toolbar对象。否则保持正常行为。

抽屉翻转卡嗒声同样如此吗?