【问题标题】:What differs Up Button to Back Button? And how to make Up Button work like Back Button?向上按钮和返回按钮有什么不同?以及如何使 Up Button 像 Back Button 一样工作?
【发布时间】:2019-01-09 06:22:24
【问题描述】:

就每个按钮如何处理活动而言?有什么区别?

我有 3 个活动(我们称它们为 A、B 和 C)。 A 是 B 的父级,B 是 C 的父级,并且一个意图需要额外的到下一个活动。我从 A 转到 B,然后从 B 转到 C。当我尝试使用向上按钮返回时,应用程序崩溃,这是因为它试图从 Intent 中的额外信息中获取信息。

但是当我使用后退按钮时,它可以工作 (???) 我不知道为什么。

我尝试使 Up Button 像 Back Button 一样工作,执行以下操作:

@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) 

编辑:更多代码 我在活动 B (UserActivity) 的 onCreate() 中有这个。在活动 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());

这里我称之为活动 C (ChatActivity)

Intent intent = new Intent(UserActivity.this, ChatActivity.class);
intent.putExtra("loggedUser", mLoggedUser);
intent.putExtra("clickedUser", mOtherUser);
startActivityForResult(intent, RC_CHAT);

ChatActivityonCreate()我有这个

    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();
    }

错误可能是未正确管理此已登录用户和其他用户。最奇怪的是,使用后退按钮 WORKS,而将 Up Button 设置为像 Back Button 一样工作却没有

【问题讨论】:

  • 当您说它不起作用时,您是否遇到错误?如果有错误,你能分享你的日志吗? :)
  • @Anmol Ye,我收到错误消息。我认为这不会有太大帮助,因为它有点具体。当我启动 B 活动时,我会从 A 中创建的意图中获得额外信息,并从中获取信息。由于我来自活动 C,我认为这个额外的意图信息丢失了,并且我得到了 NullPointerException(我不知道为什么当我使用后退按钮时它不会发生)。无论如何,我会添加日志消息:)
  • 这不是后面的问题,不要完成活动,我认为你完成的活动比以前的所有活动都失去了价值,getUsername() 为空。
  • @farhana 我在启动 C 时忘记完成() B 活动。现在它部分工作,但从 C 回到 A(B 是 C 的父级,我仔细检查了它)
  • @JoãoVítor 如果您完成活动,则不要添加finish(),那么您将失去之前活动的所有价值。

标签: android button back-button home-button up-button


【解决方案1】:

尝试更改您的代码,如下所示以模拟后退按钮行为:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

【讨论】:

  • 我在问题末尾添加了错误日志:)
  • 它表示UserActivity 中的User 实例为空。我认为问题与后退按钮无关,...请分享来自UserActivity的部分代码。
  • 我认为这不会有太大帮助,因为它有点具体。当我启动 B 活动时,我会从 A 中创建的意图中获得额外信息,并从中获取信息。由于我来自活动 C,我认为这个额外的意图信息丢失了,并且我得到了 NullPointerException(我不知道为什么当我使用后退按钮时它不会发生)。
【解决方案2】:

当您经常使用该应用程序时,向上和向后的主要区别是不可见的。

但是,例如,如果您从链接打开详细活动,则应用会打开仅包含详细活动。现在,如果您按下工具栏上的后退按钮,可能会发生以下情况:

  • 向上导航意味着,您在层次结构中向上,因此到详细活动的父项,如主页活动。
  • 返回导航意味着您返回到之前的位置,这意味着返回上次使用的应用程序,例如您打开链接的浏览器。

这取决于您如何实施,因此您必须决定什么对您的应用用户更合乎逻辑或更有用。

还尝试使用 NavUtils.navigateUpFromSameTask(this) 但它是 也不工作。我该如何解决?

这可能是因为您没有为当前所在的活动定义父活动。

查看the tutorial(尤其是Specify Parent部分),其中详细描述了有关向上导航的所有内容。


在提供堆栈跟踪后进行编辑:

所以向上导航对你有用,只有你正在导航的活动在其onCreate(...) 方法中期望某种用户。您必须确保向父 Activity 提供所有数据。

如果通过 Intent 提供数据,可以使用以下代码打开父级:

Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
    TaskStackBuilder.create(this)
        .addNextIntentWithParentStack(upIntent)
        .startActivities();
} else {
    NavUtils.navigateUpTo(this, upIntent);
}

【讨论】:

  • Zolnei 这就是我想的,但在这种情况下,我总是从活动 B 开始活动 C,这意味着(我猜)向上和后退按钮应该工作相同,但事实并非如此。而且我确实在清单中将 B 定义为 C 的父级:(
  • 看看 UserActivity.java 第 67 行,您的 User 对象在那里为空。检查为什么会发生这种情况,您可能会尝试从没有用户对象的意图中获取它。
  • 是的,我试图从意图中得到它,但是在活动 A 中添加了额外的内容,当来自活动 C 时,我不知道如何取回它。使用后退按钮时一切工作正常,但使用向上按钮时不行
  • 我不明白这段代码的用途。当我尝试从 A 到 B 时添加它时,它一直返回到 A。
  • 如果您的详细活动中有它,您可以通过意图启动父活动(包括用户数据)并完成详细活动来进行向上导航。
【解决方案3】:

我刚刚删除了 B 和 C 之间的父关系,并使用了我发布的代码 onOptionSelected() 并且它有效。即使使用它,让 B C 的父母也让它崩溃。

我仍然不知道为什么使用后退按钮有效而向上按钮无效,但它解决了问题。感谢所有试图提供帮助的人

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多