如何在没有错误的情况下在多个活动中加载导航视图?
How to have a navigation view load in multiple activities without bugs?
我按照 here 找到的指南创建了一个导航视图(注意:较新的导航视图,而不是设置不同的旧导航抽屉)。我将其设置为打开一个新的 activity,我只是再次重复了代码但更改了 class 和意图语句以反映当前的 activity。 (将 main activity extends 更改为 activity2
extends,等等)但是当我这样做时,main activity 中的文本视图也出现在 activity2
中并忽略了 textview
在 activity2
。
那么我该如何设置它才能在我的所有活动中显示导航视图,而无需复制代码数十次并且每个 activity 都有自己的 textview
?我也是一个新手 android 程序员所以说 "supposed to use a fragment" 或类似的话,我需要代码示例来真正理解我需要做什么(再次,请不要让我参考导航抽屉示例,因为这是设置不同)
我建议你使用简单的方案 - 一个 Activity
,多个 Fragments
。
例如 - 你可以在 Android studio 中使用 Navigation Drawer Activity
创建新项目(尽管它在新版本的 "Navigation Drawer" Android studio activity 将使用 NavigationView
) 创建 - 它会为您创建一个 MainActivity
。
为了支持 Fragment
s 方案,您需要在 Activity
上使用特殊容器来存放此片段的内容。让我们将 FrameLayout
添加到 layout/content_main.xml
文件中:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/app_bar_main">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
请注意,我使用 content_frame
ID 创建了 FrameLayout
- 我们稍后会用到它。
然后,例如,创建两个空白片段 - BlankFragment1
和 BlankFragment2
。
现在查看 MainActivity
中的代码,而不是 onNavigationItemSelected
方法。默认情况下,它看起来像:
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camara) {
// Handle the camera action
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
每个if
语句帮助我们区分导航视图中的菜单项。让我们将此代码更改为通过单击 R.id.nav_camara
转到 BlankFragment1
并通过单击 R.id.nav_gallery
转到 BlankFragment2
:
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
Fragment fragment;
switch (item.getItemId()) {
case R.id.nav_camara:
fragment = BlankFragment1.newInstance("param1", "param2");
break;
case R.id.nav_gallery:
fragment = BlankFragment2.newInstance("param3", "param4");
break;
default:
fragment = BlankFragment1.newInstance("param1", "param2");
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = this.getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
然后启动应用程序。现在,您可以通过单击这两个图标(相机和图库)来更改片段。希望对你有帮助。
我按照 here 找到的指南创建了一个导航视图(注意:较新的导航视图,而不是设置不同的旧导航抽屉)。我将其设置为打开一个新的 activity,我只是再次重复了代码但更改了 class 和意图语句以反映当前的 activity。 (将 main activity extends 更改为 activity2
extends,等等)但是当我这样做时,main activity 中的文本视图也出现在 activity2
中并忽略了 textview
在 activity2
。
那么我该如何设置它才能在我的所有活动中显示导航视图,而无需复制代码数十次并且每个 activity 都有自己的 textview
?我也是一个新手 android 程序员所以说 "supposed to use a fragment" 或类似的话,我需要代码示例来真正理解我需要做什么(再次,请不要让我参考导航抽屉示例,因为这是设置不同)
我建议你使用简单的方案 - 一个 Activity
,多个 Fragments
。
例如 - 你可以在 Android studio 中使用 Navigation Drawer Activity
创建新项目(尽管它在新版本的 "Navigation Drawer" Android studio activity 将使用 NavigationView
) 创建 - 它会为您创建一个 MainActivity
。
为了支持 Fragment
s 方案,您需要在 Activity
上使用特殊容器来存放此片段的内容。让我们将 FrameLayout
添加到 layout/content_main.xml
文件中:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/app_bar_main">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
请注意,我使用 content_frame
ID 创建了 FrameLayout
- 我们稍后会用到它。
然后,例如,创建两个空白片段 - BlankFragment1
和 BlankFragment2
。
现在查看 MainActivity
中的代码,而不是 onNavigationItemSelected
方法。默认情况下,它看起来像:
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camara) {
// Handle the camera action
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
每个if
语句帮助我们区分导航视图中的菜单项。让我们将此代码更改为通过单击 R.id.nav_camara
转到 BlankFragment1
并通过单击 R.id.nav_gallery
转到 BlankFragment2
:
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
Fragment fragment;
switch (item.getItemId()) {
case R.id.nav_camara:
fragment = BlankFragment1.newInstance("param1", "param2");
break;
case R.id.nav_gallery:
fragment = BlankFragment2.newInstance("param3", "param4");
break;
default:
fragment = BlankFragment1.newInstance("param1", "param2");
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = this.getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
然后启动应用程序。现在,您可以通过单击这两个图标(相机和图库)来更改片段。希望对你有帮助。