gpt4 book ai didi

Android Activity fragment 较多,生命周期变化的正确处理方式?

转载 作者:行者123 更新时间:2023-11-30 01:05:56 27 4
gpt4 key购买 nike

我有一个保存和管理六个 fragment 的 Android Activity , fragment 是流程中的一个步骤,一些 fragment 被替换,一些 fragment 被添加。

Activity 仅使用 Framelayout 作为 fragment 的容器,如下所示:

<FrameLayout
android:id="@+id/content"
android:layout_below="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent" />

然后 fragment 的流程是这样的:

//Activity starts, add first Fragment

fragmentManager.beginTransaction().replace(R.id.content, FirstFragment.newInstance(listOfItems)).commit();

然后

//User pressed button, activity got callback from first fragment

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.content, fragment2);
transaction.addToBackStack("frag2");
transaction.commit();

然后

//Another callback from Frag2, perform the add of frag 3

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.content, fragment3);
transaction.addToBackStack("frag3");
transaction.commit();

等等....

我还像这样管理 Activity 的返回堆栈:

//Controlling the back stack when the user selects the soft back button in the toolbar
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (fragmentManager.getBackStackEntryCount() == 0) {
super.onBackPressed();
overridePendingTransition(R.anim.no_change, R.anim.slide_down);
} else {
if(!BaseFragment.handleBackPressed(getSupportFragmentManager())){
super.onBackPressed();
Fragment fragment = fragmentManager.getFragments()
.get(fragmentManager.getBackStackEntryCount());
fragment.onResume(); //Make sure the fragment that is currently at the top of the stack calls its onResume method
}
}
return true;
}
return super.onOptionsItemSelected(item);
}

//Controlling the back stack when the user selects the "hardware" back button
@Override
public void onBackPressed() {
if (fragmentManager.getBackStackEntryCount() == 0) {
super.onBackPressed();
overridePendingTransition(R.anim.no_change, R.anim.slide_down);
} else {
if(!BaseFragment.handleBackPressed(getSupportFragmentManager())){
super.onBackPressed();
Fragment fragment = fragmentManager.getFragments()
.get(fragmentManager.getBackStackEntryCount());
fragment.onResume(); //Make sure the fragment that is currently at the top of the stack calls its onResume method
}
}
}

我的问题是我打开应用程序并转到这个加载 fragment 的 Activity ,然后通过流程到某个阶段(我还没有缩小范围)然后我按下主页按钮并让我的屏幕空白.现在,经过一定时间后,当我再次打开应用程序时,它会在我留下的 fragment 上打开,但一切似乎都乱七八糟,当我按回去时,它似乎弹出了错误的 fragment ,并且 UI 与不同的 fragment 混在一起。

我的猜测是,当我再次打开应用程序时,正在调用 Activity onResume 或 Fragment onResume 或某些生命周期事件,但我没有正确处理?

所以我想知道在像我这样使用 fragment 模式时是否应该遵守最佳实践、指南或模式?

最佳答案

由于您在一个 Activity 中有这么多 fragment ,并且它们使用相同的容器,这意味着所有 fragment 都在同一个地方,并且一次只会显示一个 fragment 。

那么为什么不使用 ViewPager 并让 FragmentPagerAdapter 管理这些 fragment 呢?这样就不需要自己管理fragment的生命周期,只需要重写FragmentPagerAdapter方法即可:

  • 通过getItem创建 fragment 实例,
  • 通过 getItemPositionAdapter.notifyDataSetChanged() 更新 fragment ,
  • 通过mViewPager.setCurrentItem(i)显示选定的 fragment

代码 fragment ,详见https://github.com/li2/Update_Replace_Fragment_In_ViewPager/

private FragmentPagerAdapter mViewPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public int getCount() {
return PAGE_COUNT;
}

// Return the Fragment associated with a specified position.
@Override
public Fragment getItem(int position) {
Log.d(TAG, "getItem(" + position + ")");
if (position == 0) {
return Page0Fragment.newInstance(mDate);
} else if (position == 1) {
return Page1Fragment.newInstance(mContent);
}

return null;
}

@Override
// To update fragment in ViewPager, we should override getItemPosition() method,
// in this method, we call the fragment's public updating method.
public int getItemPosition(Object object) {
Log.d(TAG, "getItemPosition(" + object.getClass().getSimpleName() + ")");
if (object instanceof Page0Fragment) {
((Page0Fragment) object).updateDate(mDate);
} else if (object instanceof Page1Fragment) {
((Page1Fragment) object).updateContent(mContent);
}
return super.getItemPosition(object);
};
};

关于Android Activity fragment 较多,生命周期变化的正确处理方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38877202/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com