如何处理活动中的后退按钮


136

如何处理活动中的后退按钮?我有一些按钮。如果单击按钮之一,它将重定向到我需要的按钮。它工作正常,但是当我按返回按钮时,它就完成了。

如何解决这个问题呢。我所有这些按钮只有一个活动。提前致谢。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    {
        return false; //I have tried here true also
    }
    return super.onKeyDown(keyCode, event);
}

我已经使用上面的代码来处理后退按钮,但它不起作用。当我按下后退按钮时,它本身就击中了。

Answers:


326

您可以这样处理:

适用于API 5级及更高版本

@Override
public void onBackPressed() {
    // your code.
}

早于API 5

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // your code
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

6
碎片呢?
粉碎者2014年

1
是的,有人知道如何从片段中做到吗
James Wierzba 2015年

3
@ james-wierzba处理活动并将委托处理为片段
Grigorii Chudnov

19

除了以上我个人推荐

onKeyUp():

说到编程 keyDown用户开始按压键会火,但在用户按下保持键重复。*

所有开发平台都是如此。

Google开发建议,如果您要在视图中拦截“返回”按钮,则应在keydown上使用starttracking跟踪KeyEvent,然后使用keyup进行调用。

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK
            && event.getRepeatCount() == 0) {
        event.startTracking();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
            && !event.isCanceled()) {
        // *** Your Code ***
        return true;
    }
    return super.onKeyUp(keyCode, event);
}

15

对于硬件设备的后退按钮和软主页(后退)按钮,例如“ <-”,这对我来说都是有效的。(*注意,我在活动中有一个应用栏/工具栏)

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



@Override
public void onBackPressed() {
   //Execute your code here
   finish();

}

干杯!


我使用了Finish,它并没有回到上一个活动。
2016年

2
“ finish()”仅关闭您当前的活动。您需要使用Intent处理返回到先前的活动。顺便说一句,如果您先前的活动在导航时未进行“ finish()”操作,则该活动仍应处于打开状态。
布鲁斯

我正在测试某些东西,并将更新您。感谢您的回复。
2013年

1
只需使用super.onBackPressed()而不是finish()
b00n12 '16

9

一种更简单的方法是捕获“后退”按钮的按下并调用moveTaskToBack(true),如下所示:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Android 2.0引入了新的onBackPressed方法,以及有关如何处理“后退”按钮的这些建议


9

您应该使用:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
            && keyCode == KeyEvent.KEYCODE_BACK
            && event.getRepeatCount() == 0) {
        // Take care of calling this method on earlier versions of
        // the platform where it doesn't exist.
        onBackPressed();
    }

    return super.onKeyDown(keyCode, event);
}

@Override
public void onBackPressed() {
    // This will be called either automatically for you on 2.0
    // or later, or by the code above on earlier versions of the
    // platform.
    return;
}

如此处所定义:http : //android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html

如果您使用的是旧版本来编译代码,请将android.os.Build.VERSION_CODES.ECLAIR替换为5(例如,您可以添加一个名为ECLAIR的私有int)


1

这帮助了我..

@Override
public void onBackPressed() {
    startActivity(new Intent(currentActivity.this, LastActivity.class));
    finish();
}

要么?????即使您可以将其用于抽屉切换

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
        startActivity(new Intent(currentActivity.this, LastActivity.class));
    finish();

}

希望对您有帮助。.:)


1

这是做某事的简单方法。

    @Override
        public void onBackPressed() {
            // do what you want to do when the "back" button is pressed.
            startActivity(new Intent(Activity.this, MainActivity.class));
            finish();
        }

我认为可能会有更多精心设计的方法,但是我喜欢简单。例如,我使用上面的模板使用户退出应用程序,然后返回到我选择的另一个活动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.