我有两个活动,一个是父母,一个是孩子。我在android manifest中设置了child的父级:
<activity android:name=".SecondActivity"
android:parentActivityName=".MainActivity"
></activity>
父:
package com.kofhearts.activityresulttest;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
Log.w("result", "result");
}
public void handleClick(View view){
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, 1);
}
}
子:
package com.kofhearts.activityresulttest;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
当我在儿童活动中按下android中的后退按钮时,onActivityResult
被称为日志消息。当我按向后箭头时,不会调用onActivityResult
。为什么会出现这种情况?我怎样才能做到这一点,无论采用哪种方法返回,都会调用onActivityResult
?
更新:
抱歉,我不太清楚。当我说回箭头时,我指的是应用栏中的箭头而不是设备后退按钮。当我们在清单文件中设置活动的父级时,会出现应用程序栏中的箭头。谢谢!
答案 0 :(得分:3)
是的,因为Up按钮已经静态地拥有Parent Activity的信息,所以没有调用它。所以当你按下它时,应该只进行父项活动。
例如,您有三个活动,如A,B,C。
B parent Activity is C
<activity android:name=".SecondActivity" android:parentActivityName=".ThirdActivity"/>
programmatically you go From A --> B
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
现在按下(第二个)活动B的向上按钮(向后箭头),然后它不应该转到任何活动。因为它很困惑。关于清单文件父活动是ThirdActivity C,但关于Stack父活动是A。
“向上”和“返回”按钮之间存在一些差异。
“向上”按钮用于根据屏幕之间的层次关系在应用内导航。
当您按下向上按钮时,它会创建&#34;新实例&#34;父活动(仅此处未调用OnActivityResult()方法的原因)。
但是Back按钮用于按照时间顺序反向导航用户最近使用过的屏幕历史。(此处使用的上一个实例,而不是创建新实例。这只是在MainActivity(Parent)中调用OnActivityResult()方法的原因。)
“向上”按钮可确保用户保留在您的应用中,“后退”按钮可以将用户返回到主屏幕,甚至可以返回到其他应用(因为它会根据历史记录进行导航)。
如果您想要向上按钮的相同行为,请按向上按钮。你应该这样写。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
super.onBackPressed();
break;
}
return true;
}
答案 1 :(得分:1)
覆盖onOptionsItemSelected
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Bundle bundle = new Bundle();
bundle.putString(FIELD_A, "Extra data");
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
finish();
break;
}
return super.onOptionsItemSelected(item);
}
答案 2 :(得分:1)
如果您正在谈论收费栏后退按钮,这可能会有所帮助
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//do something you want
finish();
}
});
}
答案 3 :(得分:0)
当您的SecondActivity退出时,您的onActivityResult()
方法将使用给定的requestCode
尝试覆盖SecondActivity中的onBackPressed()
@Override
public void onBackPressed() {
Bundle bundle = new Bundle();
bundle.putString(FIELD_A, "Extra data");//passes extra data to MainActivity
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
super.onBackPressed();
}
答案 4 :(得分:0)
使用onBackPressed()重写可以在按下后退按钮时执行代码。
@Override
public void onBackPressed()
{
// code here to show dialog
super.onBackPressed(); // optional depending on your needs
}
答案 5 :(得分:0)
执行setResult(RESULT_OK, mIntent)
后,您应该完成此活动,否则onActivityResult
可能无效。
答案 6 :(得分:0)
对我来说,这里的答案都没有奏效。我最终将错误跟踪到onOptionsItemSelected(MenuItem m)中的return语句。
A是B的父级。当按下工具栏的后退箭头按钮从活动B进入活动A时,当B的onOptionsItemSelected被调用时,没有触发A的onActivityResult:
public boolean onOptionsItemSelected(MenuItem mi){
Switch(mi.getItemId()){
case: android.R.id.home:
Intent intent = new Intent();
intent.putExtras(returnBundle);
this.setResult(Main.Magnificent_Result, intent);
finish();
break;
}
super.onOptionsItemSelected(mi);
但是这个DOES会触发A:
中的onActivityResult public boolean onOptionsItemSelected(MenuItem mi){
Switch(mi.getItemId()){
case R.id.android.home:
Intent intent = new Intent();
intent.putExtras(returnBundle);
this.setResult(Main.Magnificent_Result, intent);
finish();
return true; /// Note return statement
}
super.onOptionsItemSelected(mi);