片段 /活动信息交换



我有一个博客应用程序,我的抛弃后很难。

用户发布时,他可以通过单击一个按钮来选择一种感觉,该按钮将他带到另一个带有感觉列表的片段。一旦他选择了感觉,我就会致电PopBackStack(),以将他带到上一个屏幕。

当我需要在抛弃后显示他的选择时,我将该值保存在活动中(我在这里看到了这种技术)。这是活动的选择变量:

public class FeedActivity extends BaseActivity {
  Intent intent;
  Post post;
  private Feeling selectedFeeling;
  @Override
  protected void onCreate(Bundle savedInstanceState){
  ...

和听众对感情的范围:

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

这一切都很好:用户点击"感受"按钮,转到感觉范围,选择感觉,我将其保存到活动中,调用PopBackStack()并在倒角方法上在我的后抛弃中显示所选的感觉:

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

我的问题是,用户还可以从画廊中选择一张照片,而当他做我选择的感觉是无效的。我认为发生这种情况是因为我保存的活动重新启动了,所以我如何坚持这些数据?

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

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

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

使用ActivityonSaveInstanceState(Bundle outState)outState中保存感觉。然后阅读onCreate(Bundle savedInstanceState)savedInstanceState的感觉。对所有状态变量做同样的事情。然后,您不必担心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);
}

最新更新