[英]Passing from one fragment to another
我在这里尝试创建一个菜单,该菜单在单击时会从一个片段传递到另一个片段。 当我按菜单中的特定项目(活动)时,活动将退出,故障是
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();// this line has the problem
这是我完整的日志:
FATAL EXCEPTION: main java.lang.NullPointerException
在android.support.v4.app.BackStackRecord.replace上的android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:449)上的android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:414) (BackStackRecord.java:441)atbr.exemplozxingintegration.MainActivity.selectDrawerItem(MainActivity.java:84 atbr.exemplozxingintegration.MainActivity $ 1.onNavigationItemSelected(MainActivity.java:50)在android.support.design.widget.NavigationView $ 1.onMenuViewSelected(Navigation .java:150),位于android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811),位于android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)。在android.support.design.internal.NavigationMenuPresenter $ 1.onClick(NavigationMenuPresenter.java:308)上的support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)在android.view.View.performClick(View.java) :4439),位于android.view.View $ PerformClick.run(View.java:18395),位于android.os.Handler.handleCallback(Handler.java) :725)在android.os.Handler.dispatchMessage(Handler.java:92)在android.os.Looper.loop(Looper.java:176)在android.app.ActivityThread.main(ActivityThread.java:5319)在Java .lang.reflect.Method.invokeNative(本机方法)位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1102)上的java.lang.reflect.Method.invoke(Method.java:511)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)在dalvik.system.NativeStart.main(本机方法)
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
txResult = (TextView) findViewById(R.id.txResult);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
nvDrawer = (NavigationView) findViewById (R.id.nvView);
setupDrawerContent(nvDrawer);}
private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
selectDrawerItem(menuItem);
return true;
}
});
}
public void selectDrawerItem(MenuItem menuItem) {
// Create a new fragment and specify the planet to show based on
// position
Fragment fragment = null;
Class fragmentClass;
switch(menuItem.getItemId()) {
case R.id.nav_first_fragment:
fragmentClass = MainActivity.class;
break;
case R.id.nav_second_fragment:
fragmentClass = SecondActivity.class;
break;
case R.id.nav_third_fragment:
fragmentClass = ThirdActivity.class;
break;
default:
fragmentClass = MainActivity.class;
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
// Highlight the selected item, update the title, and close the drawer
menuItem.setChecked(true);
setTitle(menuItem.getTitle());
mDrawer.closeDrawers();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
switch (item.getItemId()) {
case android.R.id.home:
mDrawer.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
// @Override
// protected void onPostCreate(Bundle savedInstanceState) {
// super.onPostCreate(savedInstanceState);
//
SecondActivity.java
private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
selectDrawerItem(menuItem);
return true;
}
});
}
public void selectDrawerItem(MenuItem menuItem) {
// Create a new fragment and specify the planet to show based on
// position
Fragment fragment = null;
Class fragmentClass;
switch(menuItem.getItemId()) {
case R.id.nav_first_fragment:
fragmentClass = MainActivity.class;
break;
case R.id.nav_second_fragment:
fragmentClass = SecondActivity.class;
break;
case R.id.nav_third_fragment:
fragmentClass = ThirdActivity.class;
break;
default:
fragmentClass = SecondActivity.class;
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
// Highlight the selected item, update the title, and close the drawer
menuItem.setChecked(true);
setTitle(menuItem.getTitle());
mDrawer.closeDrawers();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
switch (item.getItemId()) {
case android.R.id.home:
mDrawer.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
// @Override
// protected void onPostCreate(Bundle savedInstanceState) {
// super.onPostCreate(savedInstanceState);
// }
您的问题尚不清楚,因为您尚未发布完整的课程代码,以及遇到了什么错误。
我了解的是,当在导航抽屉中选择一个项目时,您想更改片段。 与Gmail应用类似,当用户从收件箱文件夹移至已发送文件夹或任何其他文件夹时。
如果您尝试执行相同的操作,则需要进行一个“活动”,然后插入一个片段。 选择导航抽屉中的某个项目时,应根据导航抽屉中选择的选项将当前片段替换为新片段。
检查以下两个链接,这将为您提供完整的想法。
链接1: https : //androidbelieve.com/material-navigation-drawer-with-header/
链接2: http : //joerichard.net/android/android-how-to-change-fragments-when-navigation-drawer-item-selected/
FragmentTransaction.replace调用remove(Fragment)
,然后调用add(int, Fragment, String)
实际替换片段。 因此,在您的情况下,可能会发生以下情况:容器视图中没有片段,因此您正在调用remove(null)
。 因此,请检查是否必须添加或替换片段。
您可以检查容器视图中是否有任何片段,然后进行相应的操作:
FragmentManager fragmentManager = getSupportFragmentManager();
android.support.v4.app.Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.flContent);
if(currentFragment==null){
fragmentManager.beginTransaction().add(R.id.flContent, fragment).commit();
}else{
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
}
希望这能解决您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.