简体   繁体   English

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

[英]Toolbar buttons don't respond to touch when a Navigation Drawer is open

I'm working on a material design version of my app using the appcompat v7 libraries, and I've hit an issue with the navigation drawer. 我正在使用appcompat v7库处理我的应用程序的材料设计版本,我遇到了导航抽屉的问题。 When it opens, buttons in the material design toolbar cease to function - any touch outside the navigation drawer just closes the drawer. 打开时,材料设计工具栏中的按钮将停止运行 - 导航抽屉外的任何触摸都会关闭抽屉。 A following is a gif of what I mean 以下是我的意思的gif

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

Here is the xml layout I'm using for the activity: 这是我用于活动的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>

And here is the onCreate code that initialises the drawer and the toolbar. 这是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

}

Is there a way to possibly fix this? 有没有办法可以解决这个问题?

Seems that touch event is stolen by the shadow of the drawer, ie DrawerLayout keeps intercepting the touch events, because Toolbar is part of the content view, unlike the ActionBar being on top of the decor view. 似乎触摸事件被抽屉的阴影所窃取,即DrawerLayout一直拦截触摸事件,因为Toolbar是内容视图的一部分,不像ActionBar位于装饰视图的顶部。

Possible work around is intercepting the touch event: 可能的解决方法是拦截触摸事件:

If it s between 0 (top) and Toolbar height (bottom), dispatch the event directly to the Toolbar object. 如果它介于0(顶部)和Toolbar高度(底部)之间,则将事件直接分派给Toolbar对象。 Otherwise keep the normal behaviour. 否则保持正常行为。

Is same case for drawer toggle clicks? 抽屉拨动点击是否相同?

Turns out Nikola Despotoski had the right idea - the touch event was stolen by the DrawerLayout. 事实证明Nikola Despotoski有正确的想法 - 触摸事件被DrawerLayout偷走了。 However instead of intercepting the touch event I just adjusted the activity layout like so: 然而,我没有拦截触摸事件,而是调整了活动布局,如下所示:

<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>

This has the intended effect of allowing touch events to be registered by the Toolbar rather than the DrawerLayout. 这具有允许通过Toolbar而不是DrawerLayout来注册触摸事件的预期效果。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM