切换内部碎片

时间:2016-06-12 08:36:01

标签: android

我使用NavigationView创建了一个Activity(使用切换按钮打开):

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{

private DrawerLayout drawer;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_layout);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.app_name, R.string.app_name);
    drawer.addDrawerListener(toggle);
    toggle.syncState();
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    if (navigationView != null) {
        navigationView.setNavigationItemSelectedListener(this);
        navigationView.setItemIconTintList(null);
        navigationView.getMenu().getItem(0).setChecked(true);
    }
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer != null) {
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
}


@Override
public boolean onNavigationItemSelected(MenuItem item) {
    Fragment fragment = null;
    Class fragmentClass;

            fragmentClass = FirstFragment.class;

            try {
                fragment = (Fragment) fragmentClass.newInstance();
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }

            break;
    }
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.layout, fragment).commit();
    item.setChecked(true);
    setTitle(item.getTitle());
    drawer.closeDrawers();
    return true;
}
}

当我选择一个NavigationView项时,它会启动一个片段:

public class FirstFragment extends Fragment {

private View view;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.activity_layout, container, false);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
    DrawerLayout drawer = (DrawerLayout) view.findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            getActivity(), drawer, toolbar, R.string.app_name, R.string.app_name);
    drawer.addDrawerListener(toggle);
    toggle.syncState();
    return view;
}
}

问题: 当我选择按钮≡打开Fragment里面的NavigationView时,我选择了它没有打开FirstFragment的项目。 如果我从左边滑动打开Fragment里面的NavigationView,我选择它打开FirstFragment的项目。 如何在FirstFragment上重用MyActivity上的onNavigationItemSelected?

编辑:

这是acitivity_layout.xml:

 <?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"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ddffff"
android:fitsSystemWindows="true">

<LinearLayout
    android:id="@+id/list_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    //FragmentLayout
    <RelativeLayout
        android:id="@+id/layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >

        <include
            android:id="@+id/bar"
            layout="@layout/app_bar_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

            ...

    </RelativeLayout>

</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:background="#ddffff"
    app:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer" />

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

1 个答案:

答案 0 :(得分:0)

这样做的根本原因是,Fragment中的Activity使用的布局与Toolbar中的布局相同,ViewGroup位于容器内Fragment你将Fragment交易成了。一旦DrawerLayout加载了自己的ToolbarActivity,它就会覆盖Toolbar的{​​{1}},因此没有任何异常。但是,Fragment中的切换操作正在操作Fragment中的抽屉,而抽屉是第二个NavigationView尚未设置为Activity中的抽屉,所以当你点击用切换开启的抽屉时没有任何反应。但是,如果您将抽屉拖开,那个正在打开的抽屉实际上是Activity的抽屉,并且 NavigationView已正确设置,因此点击该抽屉就像预期

第一个更正是将Toolbar - 其<include>元素移动到您用作RelativeLayout容器的Fragment之外。这样可以防止在Activity加载时Toolbar的{​​{1}}被遮挡。

第二步是为Fragment定义单独的,不同的布局XML文件。您不希望在Fragment中使用与Fragment中相同的布局,主要是因为这可能不是您想要的,也因为您真的不想拥有多个,多余的ActivityDrawerLayoutToolbar,这可能会导致问题,如您所见。