Navigation Drawer 一段时间后,触摸屏幕的任何地方都保持关闭

Posted

技术标签:

【中文标题】Navigation Drawer 一段时间后,触摸屏幕的任何地方都保持关闭【英文标题】:Navigation Drawer after a while , keep closing on touch everywhere of screen 【发布时间】:2019-01-15 02:28:03 【问题描述】:

问题是在使用应用程序一段时间后,如果用户打开 Navigation Drawer 并触摸任何地方,即使 Navigation Drawer 的项目,Navigation Drawer 会一直关闭并且触摸事件会在随机时间发生,所以我无法使用调试。谁能帮我解决这个问题,我不知道为什么会这样

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) 

    try 
        // Handle navigation view item clicks here.
        int id = item.getItemId();


        if (id == R.id.nav_share) 

            try 

                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_SEND);
                // change the type of data you need to share,
                //for image use "image/*"
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_TEXT, "https://cafebazaar.ir/app/com.example.mj.darkchat/?l=fa");
                startActivity(Intent.createChooser(intent, "Share"));

             catch (Exception e) 
            
         else if (id == R.id.action_settings) 

            Intent setting = new Intent(MainActivity.this, Setting.class);
            startActivity(setting);

         else if (id == R.id.action_change_story) 
            onAllStorysRequested();

        


        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
     catch (Exception e) 
        Log.e("optionSelected", "problem is option one : " + e);
        return true;
    

【问题讨论】:

【参考方案1】:

您似乎正在进入 int id = item.getItemId(); 的状态。返回一个意外的值,并且您对 id 值的逻辑检查失败,因此无论您单击何处,代码都会落入关闭抽屉代码。很可能,出于某种原因,所有 MenuItem 的 id 字段最终都为零。

看起来像一些菜单点击启动了一个新的活动,可能当你在启动新活动或后台应用程序并返回后回来时,MenuItem 对象丢失了它们的 itemId 值。

建议您添加一些调试日志或设置断点并监控您返回的 id 值。还要添加一个最终的 else 子句,以便您可以看到意外的 menuItem 值。即:

...
 else if (id == R.id.action_change_story) 
    onAllStorysRequested();
 else 
    Log.e("optionSelected", "Unexpected MenuItem.id value : " + id);

【讨论】:

【参考方案2】:

经过多次测试,我意识到为什么会出现这个问题,问题出在我的 xml 中通知用户某事,在用户通知设置视图的可见性再次出现代码后,NavigationView 变得疯狂并且触摸事件不响应

<android.support.v4.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/drawer_layout"
android:layout_
android:layout_
android:fitsSystemWindows="true"
tools:openDrawer="start">

<include
    layout="@layout/app_bar_main"
    android:layout_
    android:layout_ />


<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_
    android:layout_
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    android:background="@color/bg_drower"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer" >
</android.support.design.widget.NavigationView>


<View
    android:id="@+id/correct_answer_view"
    android:layout_
    android:layout_
    android:background="@color/green"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:visibility="gone"/>

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

为了修复,我更改了这样的代码并在 NavigationView 之前设置了该视图,我不知道为什么但问题已解决。

<android.support.v4.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/drawer_layout"
android:layout_
android:layout_
android:fitsSystemWindows="true"
tools:openDrawer="start">

<include
    layout="@layout/app_bar_main"
    android:layout_
    android:layout_ />

<View
    android:id="@+id/correct_answer_view"
    android:layout_
    android:layout_
    android:background="@color/green"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:visibility="gone"/>

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_
    android:layout_
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    android:background="@color/bg_drower"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer" >


</android.support.design.widget.NavigationView>


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

【讨论】:

以上是关于Navigation Drawer 一段时间后,触摸屏幕的任何地方都保持关闭的主要内容,如果未能解决你的问题,请参考以下文章

在 React Navigation 中处理 Drawer Navigator 中的返回导航

有条件的 Drawer.Navigator 的 openByDefault 属性无法正常工作(“@react-navigation/drawer”:“^5.12.5”)

VueJs - Vuetify - v-navigation-drawer 与智能手机的迷你变体

v-navigation-drawer 在窗口调整大小时掉入失控循环

VuetifyJS - 滚动 v-navigation-drawer

android navigation drawer怎么用?