向上按钮和后退按钮有什么不同?以及如何使向上按钮像后退按钮一样工作?
What differs Up Button to Back Button? And how to make Up Button work like Back Button?
在每个按钮方面如何对待活动?有什么区别?
我有 3 个活动(我们称它们为 A、B 和 C)。 A 是 B 的父级,B 是 C 的父级,一个意图对下一个 activity 进行额外处理。我从 A 转到 B,然后从 B 转到 C。当我尝试使用向上按钮返回时,应用程序崩溃了,这是因为它试图从意图中的额外信息中获取信息。
但是当我使用后退按钮时,它起作用了 (???),我不知道为什么。
我试图让向上按钮像后退按钮一样工作,执行以下操作:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.home:
onBackPressed();
break;
}
return super.onOptionsItemSelected(item);
}
也尝试过使用 NavUtils.navigateUpFromSameTask(this)
但它也不起作用。我该如何解决?
编辑:错误日志
2019-01-09 03:45:43.468 29326-29326/com.jvponte.maosdadasv1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jvponte.maosdadasv1, PID: 29326
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jvponte.maosdadasv1/com.jvponte.maosdadasv1.UserActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.jvponte.maosdadasv1.User.getUsername()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:169)
at android.app.ActivityThread.main(ActivityThread.java:6568)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.jvponte.maosdadasv1.User.getUsername()' on a null object reference
at com.jvponte.maosdadasv1.UserActivity.onCreate(UserActivity.java:67)
at android.app.Activity.performCreate(Activity.java:7016)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:169)
at android.app.ActivityThread.main(ActivityThread.java:6568)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
编辑:更多代码
我在 activity B (UserActivity
) 的 onCreate()
中有这个。在 activity A
上添加了 intent extra
Intent intent = getIntent();
if(intent.hasExtra("clickedUser")){
mOtherUser = intent.getParcelableExtra("clickedUser");
}
if(intent.hasExtra("loggedUser")){
mLoggedUser = intent.getParcelableExtra("loggedUser");
}
/.../
mUsernameTV.setText(mOtherUser.getUsername());
mUserInfoTV.setText(mOtherUser.getUserInfo());
这里我调用activityC(ChatActivity
)
Intent intent = new Intent(UserActivity.this, ChatActivity.class);
intent.putExtra("loggedUser", mLoggedUser);
intent.putExtra("clickedUser", mOtherUser);
startActivityForResult(intent, RC_CHAT);
在ChatActivity
onCreate()
我有这个
Intent intent = getIntent();
if (intent.hasExtra("clickedUser")){
otherUser = intent.getParcelableExtra("clickedUser");
otherUserId = otherUser.getUid();
otherUserName = otherUser.getUsername();
}
if (intent.hasExtra("loggedUser")){
loggedUser = intent.getParcelableExtra("loggedUser");
loggedUserId = loggedUser.getUid();
}
错误可能是这个 loggedUser 和 otherUser extra 没有被正确管理。最奇怪的是,使用后退按钮可以工作,而将设置按钮设置为像后退按钮一样工作却不行
尝试像下面这样更改您的代码以模拟后退按钮行为:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
当您经常使用该应用程序时,就看不出向上和向后之间的主要区别。
但是,例如,如果您从 link 打开详细信息 activity,则应用打开时只会显示详细信息 activity。现在,如果您按下工具栏上的后退按钮,可能会发生以下情况:
- 向上 导航意味着,您将在层次结构中向上移动,因此对于详细信息 activity 的父级,就像一个家 activity。
- 后退导航意味着,你回到你之前所在的地方,所以这意味着回到上次使用的应用程序,比如你打开的浏览器 link 来自.
这取决于您如何实施,因此您必须决定什么对您的应用程序的用户更合乎逻辑或更有用。
and also tried using NavUtils.navigateUpFromSameTask(this) but it's
not working either. How can I solve it?
这可能是因为您尚未为当前所在的 activity 定义父 activity。
看看 the tutorial(尤其是 Specify Parent
部分),其中详细描述了有关向上导航的所有内容。
在提供堆栈跟踪后进行编辑:
所以向上导航对你有用,只有你导航到的 activity 在它的 onCreate(...)
方法中期望某种用户。您必须确保将所有数据提供给父级 activity。
如果您通过intents提供数据,您可以使用以下代码打开parent:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
NavUtils.navigateUpTo(this, upIntent);
}
我刚刚删除了 B 和 C 之间的父关系,并使用了我发布的代码 onOptionSelected()
,它起作用了。即使在使用它时,让 B C 的父对象崩溃也是如此。
我仍然不知道为什么使用后退按钮有效而向上按钮无效,但它解决了问题。感谢所有试图提供帮助的人
在每个按钮方面如何对待活动?有什么区别?
我有 3 个活动(我们称它们为 A、B 和 C)。 A 是 B 的父级,B 是 C 的父级,一个意图对下一个 activity 进行额外处理。我从 A 转到 B,然后从 B 转到 C。当我尝试使用向上按钮返回时,应用程序崩溃了,这是因为它试图从意图中的额外信息中获取信息。
但是当我使用后退按钮时,它起作用了 (???),我不知道为什么。
我试图让向上按钮像后退按钮一样工作,执行以下操作:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.home:
onBackPressed();
break;
}
return super.onOptionsItemSelected(item);
}
也尝试过使用 NavUtils.navigateUpFromSameTask(this)
但它也不起作用。我该如何解决?
编辑:错误日志
2019-01-09 03:45:43.468 29326-29326/com.jvponte.maosdadasv1 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jvponte.maosdadasv1, PID: 29326
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jvponte.maosdadasv1/com.jvponte.maosdadasv1.UserActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.jvponte.maosdadasv1.User.getUsername()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:169)
at android.app.ActivityThread.main(ActivityThread.java:6568)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.jvponte.maosdadasv1.User.getUsername()' on a null object reference
at com.jvponte.maosdadasv1.UserActivity.onCreate(UserActivity.java:67)
at android.app.Activity.performCreate(Activity.java:7016)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:169)
at android.app.ActivityThread.main(ActivityThread.java:6568)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
编辑:更多代码
我在 activity B (UserActivity
) 的 onCreate()
中有这个。在 activity A
Intent intent = getIntent();
if(intent.hasExtra("clickedUser")){
mOtherUser = intent.getParcelableExtra("clickedUser");
}
if(intent.hasExtra("loggedUser")){
mLoggedUser = intent.getParcelableExtra("loggedUser");
}
/.../
mUsernameTV.setText(mOtherUser.getUsername());
mUserInfoTV.setText(mOtherUser.getUserInfo());
这里我调用activityC(ChatActivity
)
Intent intent = new Intent(UserActivity.this, ChatActivity.class);
intent.putExtra("loggedUser", mLoggedUser);
intent.putExtra("clickedUser", mOtherUser);
startActivityForResult(intent, RC_CHAT);
在ChatActivity
onCreate()
我有这个
Intent intent = getIntent();
if (intent.hasExtra("clickedUser")){
otherUser = intent.getParcelableExtra("clickedUser");
otherUserId = otherUser.getUid();
otherUserName = otherUser.getUsername();
}
if (intent.hasExtra("loggedUser")){
loggedUser = intent.getParcelableExtra("loggedUser");
loggedUserId = loggedUser.getUid();
}
错误可能是这个 loggedUser 和 otherUser extra 没有被正确管理。最奇怪的是,使用后退按钮可以工作,而将设置按钮设置为像后退按钮一样工作却不行
尝试像下面这样更改您的代码以模拟后退按钮行为:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
当您经常使用该应用程序时,就看不出向上和向后之间的主要区别。
但是,例如,如果您从 link 打开详细信息 activity,则应用打开时只会显示详细信息 activity。现在,如果您按下工具栏上的后退按钮,可能会发生以下情况:
- 向上 导航意味着,您将在层次结构中向上移动,因此对于详细信息 activity 的父级,就像一个家 activity。
- 后退导航意味着,你回到你之前所在的地方,所以这意味着回到上次使用的应用程序,比如你打开的浏览器 link 来自.
这取决于您如何实施,因此您必须决定什么对您的应用程序的用户更合乎逻辑或更有用。
and also tried using NavUtils.navigateUpFromSameTask(this) but it's not working either. How can I solve it?
这可能是因为您尚未为当前所在的 activity 定义父 activity。
看看 the tutorial(尤其是 Specify Parent
部分),其中详细描述了有关向上导航的所有内容。
在提供堆栈跟踪后进行编辑:
所以向上导航对你有用,只有你导航到的 activity 在它的 onCreate(...)
方法中期望某种用户。您必须确保将所有数据提供给父级 activity。
如果您通过intents提供数据,您可以使用以下代码打开parent:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
NavUtils.navigateUpTo(this, upIntent);
}
我刚刚删除了 B 和 C 之间的父关系,并使用了我发布的代码 onOptionSelected()
,它起作用了。即使在使用它时,让 B C 的父对象崩溃也是如此。
我仍然不知道为什么使用后退按钮有效而向上按钮无效,但它解决了问题。感谢所有试图提供帮助的人