如何在没有错误的多个活动中加载导航视图?

时间:2015-11-06 07:54:05

标签: android android-layout android-activity android-studio android-navigationview

我创建了一个导航视图(注意:较新的导航视图,而不是设置不同的旧导航抽屉),遵循找到的导航here。我将其设置为打开一个新活动,我只是重复了代码,但更改了类和intent语句以反映当前活动。 (已更改的主要活动延伸至activity2延伸等)但是当我这样做时,主要活动中的文字视图也显示在activity2中,并忽略textview中的activity2

那么我该如何设置它以使导航视图显示在我的所有活动中而无需复制代码数十次并且每个活动都有自己的textview?我也是一个新手Android程序员所以说"应该使用片段"或者类似的东西,我需要代码示例才能真正理解我需要做什么(同样,请不要将我的导航抽屉样本引用给我,因为这样设置不同)

1 个答案:

答案 0 :(得分:1)

我建议您使用简单方案 - 一个Activity,多个Fragments

例如 - 您可以使用Navigation Drawer Activity Android studio 中创建新项目(尽管在新版本的 Android studio 活动中它显示“导航抽屉”将使用NavigationView创建 - 它将为您创建一个MainActivity

对于支持Fragment方案,您需要在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>

请注意,我使用FrameLayout ID创建了content_frame - 我们稍后会使用它。

然后,例如,创建两个空白片段 - BlankFragment1BlankFragment2

现在查看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语句都有助于我们区分导航视图中的菜单项。让我们点击BlankFragment1更改此代码以转到R.id.nav_camara,然后点击BlankFragment2转到R.id.nav_gallery

@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;
}

启动应用。现在,您可以通过单击这两个图标(相机和图库)来更改您的片段。希望它可以帮到你。