【问题标题】:Android Back Action Button Result in App CrashAndroid后退操作按钮导致应用程序崩溃
【发布时间】:2013-09-17 20:40:00
【问题描述】:

我正在构建一个由 3 个活动组成的新应用程序,即: - 启动画面 - 活动 A - 活动 B,以及 - 活动 C

从活动用户可以转到以下两个活动:

A -> B -> C(从行为 A 用户可以去 B 然后去 C)。 A -> C(从行为 A 用户可以直接转到 C)。 B -> C(从B用户可以到C)。

我还在活动之间传递 Serializable intent Extra。

我遇到的问题是每当我按下操作栏(左上角)上的后退按钮时,它总是使我的应用程序崩溃(错误:NULL 指针异常)。

我已尝试将此代码放在我的所有活动中。

@Override
public void onBackPressed() {
    this.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
}

我试图以某种方式模仿物理后退按钮的行为,因为它在用户按下物理后退按钮时起作用。但也有点抛出错误。

public void onBackPressed(){
  super.onBackPressed();
}

或者(这个确实是重启应用程序,这是不鼓励的,因为它会从启动屏幕重启应用程序)。

public void onBackPressed(){
  super.onBackPressed();
  finish();
}

有人知道实现后退按钮的适当方法吗?

【问题讨论】:

  • 你认为左上角的按钮是返回按钮吗?!!它的主页按钮而不是返回按钮。查看ActionBar 文档。
  • 试试 System.exit(0);而不是finish();

标签: java android back-button


【解决方案1】:

如果你使用 API level 16 或以上,真的不需要做任何事情, 我只是找到解决方案: 在清单文件中与除 MainActivity 之外的所有其他活动添加元数据,如下所示:

        android:name="android.support.PARENT_ACTIVITY"

        android:value="com.gsetia.ohama.MainActivity"/>

在这样的Activity中,例如

         <activity
                      android:name=".ViewReports"
                      android:label="@string/title_activity_view_reports"
                      android:parentActivityName=".MainActivity"
                      android:theme="@style/AppTheme" >

                     <meta-data
                     android:name="android.support.PARENT_ACTIVITY"
                     android:value="com.gsetia.ohama.MainActivity"/>

    </activity>

最后,删除 public boolean onOptionsItemSelected(MenuItem item) 方法。就是这样。

您会找到您的后退按钮并且可以正常工作

【讨论】:

    【解决方案2】:

    左上角的按钮不是“返回”按钮,应该是“向上”按钮,只是操作栏中的一个按钮,onBackPressed 是指按下的硬件返回按钮。 向后和向上导航不一定相同(“返回”表示转到我之前所在的位置,而“向上”表示转到应用程序层次结构的上层)。 请查看http://developer.android.com/design/patterns/navigation.html 了解更多信息。

    (另外,尽量避免闪屏,它们在 android 设计模式中是非常不鼓励的)

    编辑:我忘了提到如何实际处理“向上”按钮。您在活动的 onOptionsItemSelected 上执行此操作:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            // Handle "up" button behavior here.
            return true;
        } else {
            // handle other items here
        }
        // return true if you handled the button click, otherwise return false.
    }
    

    【讨论】:

    • Thx.. 我最终来回传递了 Intent-extra,所以每当用户按下按钮时。
    【解决方案3】:

    我认为,问题在于使用意图传递价值。 如果该值旨在供您的所有活动使用,我认为最好的方法 是使用共享首选项。

    【讨论】:

      【解决方案4】:

      调用后退按钮时可以这样做

      public void onBackPressed(){
          // Add data to your intent
          finish();
          startActivity(intent);
      }
      

      在您的操作栏按钮的 onClick 方法中也类似。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多