[英]startActivityForResult returning null when back navigation to activity sending result returns
I have 3 activities that start in a sequence.With the first activity needing a result from the last activity. 我有3个活动按顺序开始,第一个活动需要最后一个活动的结果。
I have it so that if Activity B is started for result (By activity A) then Activity B starts activity C for result. 我知道,如果活动B为结果而启动(按活动A),那么活动B就为结果启动了活动C。 Then once the result is captured at activity C it is finished which calls Activity B's onActivityResult which sets the result and finishes and Activity A's onActivityResult gets the final result. 然后,一旦在活动C处捕获了结果,就完成了,它调用活动B的onActivityResult来设置结果并完成,活动A的onActivityResult得到最终结果。
Activity A starts Activity B for a result which Activity C contains thus the sequence is like so 活动A启动活动B以获得活动C包含的结果,因此序列类似于
A->B->C (get result) C->B->A (result retrieved) A-> B-> C(获取结果)C-> B-> A(检索结果)
This works just fine if everything happens in sequence. 如果一切都按顺序进行,那么这很好。 However, If I navigate to activity C then press the toolbars back arrow and which leads me to activity B then navigate back to activity C and select the result. 但是,如果我导航到活动C,则按工具栏的后退箭头,然后将我带到活动B,然后导航回活动C,然后选择结果。 The result returned to activity A is null. 返回活动A的结果为空。
A->B->C->B->C(get result) C->B->A (result == null) A-> B-> C-> B-> C(获取结果)C-> B-> A(结果==空)
Activity A 活动A
public class AlertCreationActivity extends AppCombatActivity {
// OnCreate methods left out to shorten code
@OnClick(R.id.locationButton)
public void locationButtonClicked() {
Intent intent = new Intent(this, StateActivity.class);
intent.putExtra(StateActivity.IS_STARTED_FOR_RESULT, StateActivity.STARTED_FOR_RESULT);
startActivityForResult(intent, ALERT_CREATION_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ALERT_CREATION_REQUEST_CODE && resultCode == RESULT_OK) {
String title = data.getStringExtra(ALERT_CREATION_REQUEST_DATA);
if ( ! title.isEmpty()) {
mLocationButton.setVisibility(View.INVISIBLE);
mLocationTextView.setText(title);
mLocationTextView.setVisibility(View.VISIBLE);
}
}
}
}
Activity B 活动B
public class StateActivity extends AppCompatActivity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == AlertCreationActivity.ALERT_CREATION_REQUEST_CODE) {
Intent intent = new Intent();
intent.putExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA, data.getStringExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA));
setResult(RESULT_OK, intent);
finish();
}
}
}
Activity B's adapter is where the next intent happens 活动B的适配器是发生下一个意图的地方
public class StateAdapter extends RecyclerView.Adapter<StateAdapter.StateViewHolder> {
// Other Adapter methods not shown
public class StateViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
// Other View Holder methods not shown
@Override
public void onClick(View v) {
State selectedState = getStateBy(mLocationLabel.getText().toString());
// Save state ID
LocationStorage storage = new LocationStorage(mActivity);
storage.setSelectedStateId(selectedState.getId());
storage.setSelectedStateName(selectedState.getName());
Intent intent = new Intent(mActivity, SpotActivity.class);
mActivity.startActivityForResult(intent, AlertCreationActivity.ALERT_CREATION_REQUEST_CODE);
}
}
}
Activity C 活动C
public class SpotActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Initialize actionbar and recyclerview adapter
// a click on a recyclerview's list item triggers this method
adapter.setSurfSpotSelectedListener(new SurfSpotSelectedListener() {
@Override
public void onSpotSelected(String spotName) {
Intent intent = new Intent();
intent.putExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA, spotName);
setResult(RESULT_OK, intent);
finish();
}
});
}
}
导航回activity
C是什么意思?如果不启动C,则使用startActivityForResult
启动B。
You should set your result by overriding OnBackPressed(), for example: 您应该通过覆盖OnBackPressed()来设置结果,例如:
@Override
public void onBackPressed() {
setResult(111, new Intent().putExtra("result", "from c"));
super.onBackPressed();
}
For Actionbar, you should overriding onOptionsItemSelected(MenuItem item) 对于操作栏,您应该覆盖onOptionsItemSelected(MenuItem item)
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
//here
setResult(111, new Intent().putExtra("result", "from c"));
this.finish();
default:
return super.onOptionsItemSelected(item);
}
}
I ended up solving it by setting the setNavigationOnClickListener for the toolbar in Acitvity B andActivity C and calling onBackPressed() to mimic back navigation. 我最终通过为Acitvity B和Activity C中的工具栏设置setNavigationOnClickListener并调用onBackPressed()来模拟向后导航来解决了该问题。 Thanks for all your help Tiny Sunlight and Good Try. 感谢您的所有帮助Tiny Sunlight和Good Try。 Here is my Activity B & C. I hope this helps others. 这是我的活动B和C。希望这对其他人有帮助。
Activity B 活动B
public class StateActivity extends AppCompatActivity {
@Bind(R.id.toolBar) Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_spot_selection);
ButterKnife.bind(this);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
// Recyclerview and Adapter left out for brevity
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == AlertCreationActivity.ALERT_CREATION_REQUEST_CODE) {
Intent intent = new Intent();
intent.putExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA, data.getStringExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA));
setResult(RESULT_OK, intent);
finish();
}
}
}
Activity C 活动C
public class SpotActivity extends AppCompatActivity {
@Bind(R.id.toolBar) Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_spot_selection);
ButterKnife.bind(this);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
// Setting up Recyclerview and Adapter omitted
adapter.setSurfSpotSelectedListener(new SurfSpotSelectedListener() {
@Override
public void onSpotSelected(String spotName) {
Intent intent = new Intent();
intent.putExtra(AlertCreationActivity.ALERT_CREATION_REQUEST_DATA, spotName);
setResult(RESULT_OK, intent);
finish();
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.