我有一个博客应用程序,我的抛弃后很难。
用户发布时,他可以通过单击一个按钮来选择一种感觉,该按钮将他带到另一个带有感觉列表的片段。一旦他选择了感觉,我就会致电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方法上读取它。
使用Activity
的onSaveInstanceState(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);
}