片段/活动信息交换

时间:2017-03-14 13:56:01

标签: android android-activity fragment

我有一个博客应用程序,我的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());
    }
}

我的问题是,用户还可以从图库中选择一张照片,当他这样做时,我选择的感觉结果为空。我认为这是因为我保存它的活动重新开始,所以我怎么能坚持这些数据呢?

3 个答案:

答案 0 :(得分: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");
        }
    }
}

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

答案 1 :(得分:0)

使用onSaveInstanceState(Bundle outState)的{​​{1}}来保存Activity的感觉。然后阅读outState savedInstanceState中的感受。对所有状态变量执行相同操作。然后你不担心Android何时以及为什么破坏你的活动。它将与之前的州再次“复活”。

答案 2 :(得分:0)

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);
}