我有一个博客应用程序,我的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());
}
}
我的问题是,用户还可以从图库中选择一张照片,当他这样做时,我选择的感觉结果为空。我认为这是因为我保存它的活动重新开始,所以我怎么能坚持这些数据呢?
答案 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);
}