【问题标题】:Fragment / Activity info exchange片段/活动信息交换
【发布时间】:2017-03-14 13:56:01
【问题描述】:

我有一个博客应用程序,但我在使用 PostFragment 时遇到了困难。

当用户发帖时,他可以通过点击一个按钮来选择一种感觉,该按钮将他带到另一个带有感觉列表的片段。一旦他选择了感觉,我就调用 popBackStack() 以便将他带到上一个屏幕。

因为我需要在 PostFragment 上显示他的选择,所以我将该值保存在 Activity 中(我在 SO 中看到了这种技术)。这是活动的 selectedFeeling 变量:

public class FeedActivity extends BaseActivity {

  Intent intent;
  Post post;
  private Feeling selectedFeeling;

  @Override
  protected void onCreate(Bundle savedInstanceState){
  ...

FeelingsFragment 上的听众:

private AdapterView.OnItemClickListener onGridViewItemClick() {
    return new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            Feeling selected = feelings.get(position);
            ((FeedActivity)getActivity()).setSelectedFeeling(selected);
            getActivity().getSupportFragmentManager().popBackStack();
        }
    };
}

一切都运行良好:用户点击感觉按钮,转到 FeelingsFragment,选择感觉,我将其保存到活动中,调用 popBackStack() 并在 OnResume 方法上的 PostFragment 中显示选择的感觉:

@Override
public void onResume() {
    super.onResume();
    selectedFeeling = ((FeedActivity)getActivity()).getSelectedFeeling();
    if(selectedFeeling != null){
        selectedFeelingTv.setText(getString(R.string.selected_feeling) + selectedFeeling.getFeeling());
    }
}

我的问题是用户也可以从图库中选择一张照片,当他这样做时,我选择的感觉结果是空的。我认为发生这种情况是因为我保存它的 Activity 已重新启动,那么我该如何保留该数据?

【问题讨论】:

标签: android android-activity fragment


【解决方案1】:

您可以在您的活动中使用它以保持价值:

@Override
  protected void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);
      outState.putSerializable("selectedFeeling", selectedFeeling);
  }

要检索值,您可以使用它(也在活动中):

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if(savedInstanceState != null){
            if(savedInstanceState.getSerializable("selectedFeeling")!=null){
            selectedFeeling = (Feeling)savedInstanceState.getSerializable("selectedFeeling");
        }
    }
}

上面的代码发生了什么:当 Activity 被销毁时保存实例,然后在 Activity 恢复时检索它。重要的是要强调您需要重新设置该值,以便您的片段可以在其 onResume 方法上读取它。

【讨论】:

    【解决方案2】:

    使用Activity 中的onSaveInstanceState(Bundle outState) 来保存outState 中的感觉。然后在onCreate(Bundle savedInstanceState) 中阅读savedInstanceState 的感受。对所有状态变量执行相同操作。那么您就不用担心 Android 何时以及出于什么原因会破坏您的活动。它会以之前的状态再次“复活”。

    【讨论】:

      【解决方案3】:

      在 Fragment 和 Activity 之间交换数据的 Android 方式是使用广播和广播接收器。因此,我建议您执行以下操作: 在您的片段中,创建您的广播

      public void createBroadcast()
      {
          Intent broadcast = new Intent();
          broadcast.setAction(RequestCode.SUBMIT_BROADCAST);//This code is a static int just to identify your broadcast
          broadcast.putExtra("String identifier", your data);
          context.sendBroadcast(broadcast);
      
      }
      

      当用户选择某些东西(你的感觉)时触发它

      在活动中,注册你的广播接收器并更新活动

       private BroadcastReceiver br;
       ......
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          br = new BroadcastReceiver() {
              @Override
              public void onReceive(Context context, Intent intent) {
                  Bundle bundle =intent.getExtras();
                  String key =bundle.getString("your string identifier"); //the code for updating your activity goes next
      
              }
          };
      
      IntentFilter filter = new IntentFilter(RequestCode.SUBMIT_BROADCAST);
      this.registerReceiver(br,filter);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        相关资源
        最近更新 更多