我创建了一个包含vIEwpager的HomeFragment,并将其添加到MainActivity中,效果很好.但是,当我单击以转到另一个片段(如BucketFragment),然后单击以返回到家庭片段时,它崩溃了,并抛出了nullpointer异常.
这是MainActivity
public class MainActivity extends AppCompatActivity implements NavigationVIEw.OnNavigationItemSelectedListener{ private DrawerLayout mDrawer; private HomeFragment mHomeFragment; private likeFragment mlikeFragment; private BucketFragment mBucketFragment;@OverrIDeprotected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); NavigationVIEw navigationVIEw = (NavigationVIEw) findVIEwByID(R.ID.nav_vIEw); navigationVIEw.setNavigationItemSelectedListener(this); // add the fragment content FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentByID(R.ID.fragment_container); if (fragment == null) { fragment = HomeFragment.newInstance(); mHomeFragment = (HomeFragment) fragment; fm.beginTransaction() .add(R.ID.fragment_container, fragment) .commit(); }}@OverrIDepublic boolean onNavigationItemSelected(@NonNull MenuItem item) { Fragment currentFragment = null; Intent intent = null; switch (item.getItemID()) { case R.ID.nav_home: if (mHomeFragment == null) { mHomeFragment = HomeFragment.newInstance(); } currentFragment = mHomeFragment; break; case R.ID.nav_like: if (mlikeFragment == null) { mlikeFragment = likeFragment.newInstance(); } currentFragment = mlikeFragment; break; case R.ID.nav_bucket: if (mBucketFragment == null) { mBucketFragment = BucketFragment.newInstance(); } currentFragment = mBucketFragment; break; case R.ID.nav_help: intent = HelpActivity.newIntent(this); break; case R.ID.nav_Feedback: intent = FeedBackActivity.newIntent(this); break; default:break; } if (currentFragment != null) { FragmentManager fm = getSupportFragmentManager(); fm.beginTransaction() .replace(R.ID.fragment_container, currentFragment) .commit(); setTitle(item.getTitle()); } else { startActivity(intent); } mDrawer.closeDrawer(GravityCompat.START); return true;}}
这是HomeFragment
public class HomeFragment extends Fragment { private static final int NUM_CATOGARY = 2; private VIEwPager mVIEwPager; public static HomeFragment newInstance() { return new HomeFragment();}@OverrIDepublic voID onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState);}@Nullable@OverrIDepublic VIEw onCreateVIEw(@NonNull LayoutInflater inflater, @Nullable VIEwGroup container, @Nullable Bundle savedInstanceState) { VIEw v = inflater.inflate(R.layout.fragment_home, container, false); mVIEwPager = (VIEwPager) v.findVIEwByID(R.ID.vIEw_pager); TabLayout tab = (TabLayout) v.findVIEwByID(R.ID.tab); tab.setupWithVIEwPager(mVIEwPager); FragmentManager fm = getChildFragmentManager(); mVIEwPager.setAdapter(new FragmentStatePagerAdapter(fm) { @OverrIDe public Fragment getItem(int position) { switch (position) { case 0: return PopularFragment.newInstance(); case 1: return RecentFragment.newInstance(); } return null; } @OverrIDe public int getCount() { return NUM_CATOGARY; } @Nullable @OverrIDe public CharSequence getPageTitle(int position) { switch (position) { case 0: return getResources().getText(R.string.tab_popular); case 1: return getResources().getText(R.string.tab_recent); } return null; } }); return v;}}
和fragment_home.xml
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"androID:orIEntation="vertical"><androID.support.design.Widget.TabLayout androID:ID="@+ID/tab" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content"/><androID.support.v4.vIEw.VIEwPager androID:ID="@+ID/vIEw_pager" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"/>
当我单击以返回到家庭片段时,它将引发运行时异常
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object androID.util.SparseArray.get(int)' on a null object reference at androID.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:902) at androID.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:216) at androID.support.v4.vIEw.VIEwPager.onRestoreInstanceState(VIEwPager.java:1455) at androID.vIEw.VIEw.dispatchRestoreInstanceState(VIEw.java:14956) at androID.vIEw.VIEwGroup.dispatchRestoreInstanceState(VIEwGroup.java:3253) at androID.vIEw.VIEwGroup.dispatchRestoreInstanceState(VIEwGroup.java:3259) at androID.vIEw.VIEw.restoreHIErarchyState(VIEw.java:14934) at androID.support.v4.app.Fragment.restoreVIEwState(Fragment.java:396) at androID.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1445) at androID.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750) at androID.support.v4.app.FragmentManagerImpl.movetoState(FragmentManager.java:1819) at androID.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797) at androID.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590) at androID.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377) at androID.support.v4.app.FragmentManagerImpl.removeRedundantoperationsAndExecute(FragmentManager.java:2332) at androID.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239) at androID.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:700) at androID.os.Handler.handleCallback(Handler.java:815) at androID.os.Handler.dispatchMessage(Handler.java:104) at androID.os.Looper.loop(Looper.java:207) at androID.app.ActivityThread.main(ActivityThread.java:5770) at java.lang.reflect.Method.invoke(Native Method) at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:679)
解决方法:
问题出在这段代码中
if (currentFragment != null) { FragmentManager fm = getSupportFragmentManager(); fm.beginTransaction() .replace(R.ID.fragment_container, currentFragment) .commit(); setTitle(item.getTitle()); }
replace方法的作用与remove add相同,这意味着您在堆栈中没有要返回的片段,因此您应该放入add代替或添加此行.addToBackStack(null); .commit之前.它会将您的 *** 作放回堆栈,然后您可以使用“后退”按钮返回
总结以上是内存溢出为你收集整理的android-将片段替换为包含viewpager的片段时崩溃全部内容,希望文章能够帮你解决android-将片段替换为包含viewpager的片段时崩溃所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)