我有一个输入表单,我在文本字段中收集与FirstActivity绑定的4个值。用户输入4个值并单击一个按钮,该按钮将向用户显示与SecondActivity关联的2个选项。
单击SecondActivity中的其中一个选项后,将显示带有搜索选项的第3个屏幕。在搜索时,他以列表的形式呈现搜索结果。
当用户点击其中一个结果时,我想更新FirstActivity中的一个字段,同时保留用户最初选择的所有值。我使用Intent标志来保留状态,除了一个问题外它没有用 - 我在第一个屏幕上看不到更新的值。
问题:虽然这段代码可以帮助我保留FirstActivity中的初始状态,但是当我返回FirstActivity时它并没有更新CopiesValue。我希望使用在ThirdActivity中选择的值更新副本值。 FirstActivity上的所有原始值都保留了......
我希望在第三个屏幕上选择一个值后,ThirdActivity的更新值会反映在第一个屏幕上。
这是我在ThirdActivity中的onClickListener中的代码:
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object o = lv.getItemAtPosition(position);
String str = (String) o;
Globals g = Globals.getInstance();
((FirstActivity)g.getFirstContext()).getSettingHolder().setSelectedCopiesValue(5);
Intent intent = new Intent(g.getFirstContext(), FirstActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivityForResult(intent, 1);
finish();
}
});
这是我的AndroidManifest.xml条目:
<activity
android:name=".activity.FirstActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|layoutDirection|fontScale"
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activity.SecondActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.FirstActivity" />
</activity>
<activity android:name=".activity.ThirdActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.FirstActivity" />
</activity>
答案 0 :(得分:0)
LocalBroadcastRecevier
会在这里做到这一点......
在您的FirstActivity中注册接收器:
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Handle data coming from thirdActivity
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
// Register to receive messages.
// We are registering an observer (mMessageReceiver) to receive Intents
// with actions named "custom-event-name".
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
new IntentFilter("custom-event-name"));
}
@Override
protected void onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
将这些行添加到ThirdActivity(发件人)
private void sendMessage() {
Intent intent = new Intent("custom-event-name");
intent.putExtra("KEY", "Value");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
// OnClick event of something...
@Override
public void onClick(View v) {
sendMessage();
}
答案 1 :(得分:0)
您可以使用EventBus
实现所需目的,创建模型类以将数据从第三个活动传递到第一个活动
在gradle中添加以下依赖项
compile 'org.greenrobot:eventbus:3.0.0'
<强> CopyModel.java 强>
public class CopyModel{
private int copies;
public CopyModel(int copies){
this.copies = copies;
}
public int getSelectedCopies(){
return copies;
}
}
<强> ThirdActivity 强>
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object o = lv.getItemAtPosition(position);
String str = (String) o;
EventBus.getDefault().post(new CopyModel(5)); //<-- pass data before navigating to first activity
Intent intent = new Intent(g.getFirstContext(), FirstActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivityForResult(intent, 1);
finish();
}
});
<强> FirstActivity 强>
private int selectedCopies; //global declaration
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(CopyModel copyModel) {
//get your selected copies and assign it to global variable
this.selectedCopies = copyModel.getSelectedCopies();
}
@Override
public void onResume(){
//you can use new selectedCopies value here and write code to update UI based on new value
}
答案 2 :(得分:0)
除了 @Wizard 上面的答案之外,我还需要做一些更改才能使我的应用程序正常工作。我现在可以在第一个活动屏幕上看到第三个活动的更新值,而所有其他初始值都保留。
在Broadcast.onReceive方法中,我不得不在同一个活动(FirstActivity)上调用intent。
我不确定在同一个活动中调用意图是否是一个好习惯。这会导致任何性能问题吗?有人可以在这里评论最佳实践吗?
在FirstActivity中
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String selectedCopies = intent.getStringExtra("selectedCopies");
Intent intent1 = new Intent(getApplicationContext(), FirstActivity.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent1);
}
};
在ThirdActivity中(点击列表项)
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object o = lv.getItemAtPosition(position);
String selectedCopies = (String) o; //As you are using Default String Adapter
Intent intent = new Intent("custom-event-name");
intent.putExtra("selectedCopies", selectedCopies);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
LocalBroadcastManager.getInstance(g.getMainContext()).sendBroadcast(intent);
}
});