【问题标题】:Preserve the state of fragment when previous button is clicked单击上一个按钮时保留片段的状态
【发布时间】:2019-12-11 08:48:10
【问题描述】:

我的安卓应用程序有BottomNavigationBar。它包含 5 个片段。其中一个片段包含嵌套片段,这是一个多步骤过程。

第一个嵌套片段包含下一个按钮。第二个嵌套片段包含上一个和下一个按钮。第三个嵌套片段包含上一个和提交按钮。每个片段都有不同的EditText

在第一个片段中添加值后,当我单击下一步按钮时,它会转到第二个片段。在第二个片段中,当我单击上一个按钮时,它会再次转到第一个片段,并且相同的过程适用于第二个和第三个片段

我的问题是:

1)当第二个片段中的上一个按钮被点击时,我想要第一个片段中EditText 的所有值,当再次点击第一个片段的下一个按钮时,我想要EditText 的所有值第二个片段原样。有没有办法做到这一点?

2)当用户点击第三个片段中的提交按钮时,我想要所有嵌套片段的所有EditText 值。如何做到这一点?

【问题讨论】:

  • 哪个片段包含EditText,你想在哪个片段中使用它的值?
  • 所有片段都包含EditText。我想要最后一个片段中的所有值

标签: android android-fragments fragment


【解决方案1】:

是的,

这可以通过两种方式实现,

1) 片段保存实例状态

https://stackoverflow.com/a/17135346/7316675

2) 将值保存在某个活动或应用程序级别,并在片段屏幕的恢复时访问它

【讨论】:

【解决方案2】:

您可以使用Bundle 来存储值,然后在恢复片段时恢复它们。您可以在onStop()(推荐)或onPause() 中执行此操作。

Private static final String KEY_ADDRESS = "ADDRESS" ;
@Override
Public void onstop(){
   Bundles state = new Bundle ();
   String  address = etv1.getText().toString();
   // Get more strings from the etvs
   state.putString(KEY_ADDRESS, address);
   // Store more strings into the bundle
   setInitialSavedState(state)
}

要恢复值,您可以使用系统传递给 onCreate() 的已保存实例状态,或者将包传递给 onCreate() 中自行创建的公共包并在 onResume() 中访问,如下所示:

String address = bundle.getString(KEY_ADDRESS);

至于传递的结果,您可以在按下下一个或上一个按钮时将包传达给它们的父活动,并在按下提交时随心所欲地处理它。从docsthis answer 了解有关如何执行此操作的更多信息

【讨论】:

  • 我得到这个错误:setInitalSavedState in Fragment can not be applied to android.os.Bundle
【解决方案3】:

我的第一个问题的解决方案。

我使用了FragmentManagerpopBackStack() 方法。使用它我可以返回到堆栈的上一个片段。我已将此代码添加到上一个按钮的OnClickListener

FragmentManager fm = getActivity().getSupportFragmentManager();
if(fm.getBackStackEntryCount()!=0){
fm.popBackStack();
}

我的第二个问题的解决方案:

使用 setArguments() 方法设置值并使用 getArguments() 方法获取值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多