我使用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>
答案 0 :(得分:0)
这样做的根本原因是,Fragment
中的Activity
使用的布局与Toolbar
中的布局相同,ViewGroup
位于容器内Fragment
你将Fragment
交易成了。一旦DrawerLayout
加载了自己的Toolbar
和Activity
,它就会覆盖Toolbar
的{{1}},因此没有任何异常。但是,Fragment
中的切换操作正在操作Fragment
中的抽屉,而抽屉是第二个NavigationView
尚未设置为Activity
中的抽屉,所以当你点击用切换开启的抽屉时没有任何反应。但是,如果您将抽屉拖开,那个正在打开的抽屉实际上是Activity
的抽屉,并且 NavigationView
已正确设置,因此点击该抽屉就像预期
第一个更正是将Toolbar
- 其<include>
元素移动到您用作RelativeLayout
容器的Fragment
之外。这样可以防止在Activity
加载时Toolbar
的{{1}}被遮挡。
第二步是为Fragment
定义单独的,不同的布局XML文件。您不希望在Fragment
中使用与Fragment
中相同的布局,主要是因为这可能不是您想要的,也因为您真的不想拥有多个,多余的Activity
,DrawerLayout
和Toolbar
,这可能会导致问题,如您所见。