android-将片段替换为包含viewpager的片段时崩溃

android-将片段替换为包含viewpager的片段时崩溃,第1张

概述我创建了一个包含viewpager的HomeFragment,并将其添加到MainActivity中,效果很好.但是,当我单击以转到另一个片段(如BucketFragment),然后单击以返回到家庭片段时,它崩溃了,并抛出了nullpointer异常.这是MainActivitypublicclassMainActivityextendsAppCompatActivityimple

我创建了一个包含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的片段时崩溃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1081024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存