从子活动更新父活动中的一个值,同时保留父项上的所有剩余原始值

时间:2017-12-08 06:12:36

标签: android android-activity

我有一个输入表单,我在文本字段中收集与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>

3 个答案:

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