【问题标题】:Android fragment back press without any data lossAndroid片段回压没有任何数据丢失
【发布时间】:2017-01-12 13:47:20
【问题描述】:

当我单击每个导航列表时,我正在创建一个带有导航抽屉的应用程序,新片段将加载。其中一个片段有listView。当我单击此列表时,加载另一个片段。现在我使用导航抽屉移动到不同的片段。每次我想移动到上一个片段而不更改任何数据时,我都按后退按钮。我该怎么做?

我正在使用以下代码加载片段:

FragmentManager fm = getFragmentManager();
        for (int i = 0; i < fm.getBackStackEntryCount(); i++) {
            fm.popBackStack();
        }
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.replace(R.id.fragmentHome, fr);
            fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            fragmentTransaction.commit();

简而言之:: 每次后按我都想加载前一个片段而不重新创建它

【问题讨论】:

  • 您可以使用添加片段代替替换片段,否则您可以使用数据模型进行临时存储。
  • 如果我使用临时存储,我可以避免这种情况。但是在本地保存数据并不容易,里面的数据太多了。
  • 是的!然后你必须使用 Sqlite 来存储这些数据。
  • 目前无法存储数据。还有其他选择吗?
  • 在使用片段时,我们知道我们会在销毁片段时丢失数据,因此您必须使用临时存储来存储数据或 Sqlite 没有其他选择,或者正如我所说,而不是替换片段使用添加片段。

标签: android android-fragments


【解决方案1】:

我认为这可能会有所帮助

FragmentmanagerPopBackStack

FragmentManager fm = getFragmentManager();
        for (int i = 0; i < fm.getBackStackEntryCount(); i++) {
            fm.popBackStack();
        }

在那个片段中

View mView ; //this will be global

@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        try {
            if (mView == null) {
                // view will be initialize for the first time .. you can out condition for that if data is not null then do not initialize view again. 
                mView = inflater.inflate(R.layout.xml,container, false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return mView;
    }

【讨论】:

  • 这里的 mView 总是为空??同样对于 PopBackStack,我也在做同样的事情吗?我的代码有什么问题?
  • 不,它会第一次初始化。那么它一旦初始化就具有一定的价值。就像如果你 Fragmnet A -&gt; FragmentB 然后你回栈 FragmentB 然后在类 Fragment A 你应该在这里实现这个 oncreateview Fragment A 第一次创建然后 mView 将初始化。在你可以推FragmentB之后..一旦FragmentB会比FragmentA弹出,mView将有它的价值..你可以检查一下
  • 检查我的问题 fragmentTransaction.replace(R.id.fragmentHome, fr);这是对还是错?
  • @Amsheer, fragmentTransaction.replace(R.id.fragmentHome, fr); 将在fragmentHome 框架布局中推送片段。如果片段已经在堆栈中。那么我们只需要popBackStack() 去那个片段,如上所述。
  • 我希望我也这样做了。我根据您在 getView 中的回答进行了更改。我创建片段代码有什么问题?
【解决方案2】:
public  void addFragment( final Fragment newFragment, final Fragment hideFragment) {
    final FragmentManager fragmentManager = getFragmentManager();
    final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.hide(hideFragment);
    fragmentTransaction.add(R.id.container, newFragment, newFragment.getClass().getSimpleName());
    fragmentTransaction.addToBackStack(hideFragment.getClass().getSimpleName());
    fragmentTransaction.commitAllowingStateLoss();
}

使用它而不是替换片段。将解决您的问题。

【讨论】:

  • 这不是一个好的解决方案,因为添加片段时内存会增加并且没有使用片段。 OP 已经在做正确的事情了。
  • 我知道,但是如果他不想使用任何临时存储或任何其他存储怎么办,您有什么解决方案吗?
  • 检查 Mayur raval 的答案,这是实现 OP 需求的正确方法。
  • 如果你使用popBackStack()堆栈替换片段一个之后你得到了什么,你能告诉我吗?
  • 第一次初始化。那么它一旦初始化就具有一定的价值。就像如果你 Fragmnet A -> FragmentB 然后你 backstack FragmentB 然后在类 Fragment A 你应该在第一次创建 Fragment A 时在这里实现这个 oncreateview 然后 mView 将初始化。在你可以推 FragmentB 之后..一旦 FragmentB 将比在 FragmentA 中弹出,mViewwill 有它的价值..你可以检查一下。 (从评论中复制)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多