AndroidStudio
によって自動的に作成されたナビゲーションビューをアプリに実装しました。新しいプロジェクトを作成したときにNavigationDrawer
Activity
を手に入れましたが、メニュー項目は問題ないようですが、メニュー項目をクリックしても何も起こりませんでした。以下は私の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
どうか、誰かが私を助けてくれて、ありがとう
私は私の質問を解決しました、単にactivity_main.xmlの順序を変更するだけです。 DrawerLayoutビューグループにLinearLayoutビューグループとNavigationViewがあります。最初にNavigationViewがビューグループの最初になり、順序を変更します。最初の1つはLinearLayoutで、2番目はNavigationViewであり、想定どおりに機能します。親愛な!!!
しかし、なぜそれが起こったのか誰かに教えてもらえますか?表示順序に関係なく、ビューグループ内のビューの順序は重要ですか。
ナビゲーションドロワーのヘルプ これを言う:
メインのコンテンツビュー(上記の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でこの種の「問題」に何度か直面しており、とても混乱しています。
私にもこの問題があり、最終的に何が問題かを理解しました。最初にナビゲーションドロワーを使用してサンプルプロジェクトを作成しました。メインのアクティビティ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が邪魔されなかったが、コールバックが邪魔されたのは奇妙でした。
ナビゲーションドロワーのヘルプ これを言う:
メインのコンテンツビュー(上記の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でこの種の「問題」に何度か直面しており、とても混乱しています。
私はこの問題を抱えていましたが、答えはどれも私を助けません。しかし、最終的に解決しました。私の場合、アクティビティで使用したため、リスナーは呼び出されませんでした:
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;
}
});
}
お役に立てれば幸いです。