web-dev-qa-db-ja.com

onNavigationItemSelectedが呼び出されない

AndroidStudioによって自動的に作成されたナビゲーションビューをアプリに実装しました。新しいプロジェクトを作成したときにNavigationDrawerActivityを手に入れましたが、メニュー項目は問題ないようですが、メニュー項目をクリックしても何も起こりませんでした。以下は私のonNavigationItemSelected()メソッドです:

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    Toast.makeText(MainActivity.this,"onNavigationItemSelected",Toast.LENGTH_LONG).show();
    // Handle navigation view item clicks here.
    item.setChecked(true);
    int id = item.getItemId();

    if (id == R.id.medicalRecord) {
        Toast.makeText(MainActivity.this,id,Toast.LENGTH_LONG).show();
    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

}

そして、私のonCreateメソッドでは、その中にNavigationViewを作成します

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear_layout);
    if (babyImage.exists()) {
        Drawable drawable = Drawable.createFromPath(Environment.getExternalStorageDirectory() + "/babycare/temp.jpg");
        linearLayout.setBackground(drawable);
    }

    DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerLayout.openDrawer(Gravity.LEFT);
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

もちろん、私はクラスにNavigationView.OnNavigationItemSelectedListenerを実装しました。

このNavigationViewをマテリアルデザインテーマに実装する必要があるかどうか疑問に思っています。今私のアプリで使用されているテーマは@style/AppTheme

どうか、誰かが私を助けてくれて、ありがとう

16
Nick Su

私は私の質問を解決しました、単にactivity_main.xmlの順序を変更するだけです。 DrawerLayoutビューグループにLinearLayoutビューグループとNavigationViewがあります。最初にNavigationViewがビューグループの最初になり、順序を変更します。最初の1つはLinearLayoutで、2番目はNavigationViewであり、想定どおりに機能します。親愛な!!!

しかし、なぜそれが起こったのか誰かに教えてもらえますか?表示順序に関係なく、ビューグループ内のビューの順序は重要ですか。

27
Nick Su

ナビゲーションドロワーのヘルプ これを言う:

メインのコンテンツビュー(上記のFrameLayout)はDrawerLayoutの最初の子である必要があります。これは、XMLの順序がz順序を意味し、ドロワーがコンテンツの上にある必要があるためです。

この例に関して:

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

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

    <!-- The navigation drawer -->
    <ListView 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"/>
</Android.support.v4.widget.DrawerLayout>

これが説明です。自動生成されたテンプレートの結果、レイアウトの順序が間違っていると、いらいらします。私はAndroid Studioでこの種の「問題」に何度か直面しており、とても混乱しています。

16
leobelizquierdo

私にもこの問題があり、最終的に何が問題かを理解しました。最初にナビゲーションドロワーを使用してサンプルプロジェクトを作成しました。メインのアクティビティxmlは次のとおりです。

<include
    layout="@layout/app_bar_main"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

<Android.support.design.widget.NavigationView
    Android:id="@+id/nav_view"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer" />

しかし、私が作った実際のアプリでは、私はこのような間違いをしました、

<?xml version="1.0" encoding="utf-8"?>
<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_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:openDrawer="start">

<Android.support.design.widget.NavigationView
    Android:id="@+id/nav_view"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer" />

<LinearLayout...../>
</Android.support.v4.widget.DrawerLayout>

問題だったNavigationViewの下にLinearLayoutがありました。

それから私はこれをしました、すべてがうまく働き始めました。

<?xml version="1.0" encoding="utf-8"?>
<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_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:openDrawer="start">

<LinearLayout...../>

<Android.support.design.widget.NavigationView
    Android:id="@+id/nav_view"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer" />
</Android.support.v4.widget.DrawerLayout>

キーは、最後にNavigationViewを配置することでした。 UIが邪魔されなかったが、コールバックが邪魔されたのは奇妙でした。

13
Satheeshwaran

ナビゲーションドロワーのヘルプ これを言う:

メインのコンテンツビュー(上記のFrameLayout)は、DrawerLayoutの最初の子である必要があります。これは、XMLの順序がz順序であり、ドロワーが一番上にある必要があるためです。コンテンツの。

この例に関して:

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

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

    <!-- The navigation drawer -->
    <ListView 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"/>
</Android.support.v4.widget.DrawerLayout>

自動生成されたテンプレートの結果、レイアウトの順序が間違っていると、いらいらします。私はAndroid Studioでこの種の「問題」に何度か直面しており、とても混乱しています。

1
leobelizquierdo

私はこの問題を抱えていましたが、答えはどれも私を助けません。しかし、最終的に解決しました。私の場合、アクティビティで使用したため、リスナーは呼び出されませんでした:

NavigationUI.setupWithNavController(navigationView, navController);

これはOnNavigationItemSelectedListenerをオーバーライドするので、その行を削除し、リスナーを次のように設定しました。

final NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(new 
NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            FragmentManager fm = getSupportFragmentManager();
            fm.popBackStackImmediate();
            boolean handled = NavigationUI.onNavDestinationSelected(item, navController);
            if (handled) {
                ViewParent parent = navigationView.getParent();
                if (parent instanceof DrawerLayout) {
                    ((DrawerLayout) parent).closeDrawer(navigationView);
                }
            }
            return handled;
        }
    });

以下は、私のリスナーをオーバーライドするNavigationUIの一部です。

public static void setupWithNavController(@NonNull final NavigationView navigationView,
        @NonNull final NavController navController) {
    navigationView.setNavigationItemSelectedListener(
            new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    boolean handled = onNavDestinationSelected(item, navController);
                    //******* CUTTED ***************
                    return handled;
                }
            });
}

お役に立てれば幸いです。

0
Alessandro