Як керувати кнопкою "назад" у діяльності


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

Я використовував вище код для обробки кнопки повернення, але його не працює. Коли я натискаю кнопку назад, вона потрапила туди сама.

Відповіді:


326

Ви можете впоратися з цим так:

для рівня 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
А як щодо фрагментів?
дробитель

1
Так, хтось знає, як це зробити з фрагмента
Джеймс Віцерба

3
@ james-wierzba обробляють активність та делегують обробку фрагменту
Григорій Чуднов

19

На додаток до сказаного я особисто рекомендую

onKeyUp():

Programatically Говорячи KeyDown буде спрацьовувати , коли користувач натискає кнопку спочатку , але це буде повторюватися , поки користувач утримує клавішу. *

Це залишається актуальним для всіх платформ розвитку.

Розробка Google запропонувала, що якщо ви перехоплюєте кнопку НАЗАД у вікні, слід відстежувати KeyEvent із запуском на клавіатурі та запускати клавішу.

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

}

Ура!


Я використовував фініш, і це не повертається до попередньої діяльності.
Si8

2
"Finish ()" закриває лише поточну активність. Потрібно обробити повернення до попередньої діяльності, використовуючи наміри. До речі, ваша попередня діяльність все одно має бути відкритою, якщо ви не "закінчували ()" її під час навігації з неї раніше.
S bruce

Я щось тестую і буду вас оновити. Дякуємо за відповідь.
Si8

1
Просто використовуйте super.onBackPress () замість закінчення ()
b00n12

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 представив новий метод onBackPress, і ці рекомендації щодо керування кнопкою "Назад"


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 (ви можете додати приватний int з іменем ECLAIR, наприклад)


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

Я думаю, що можуть бути більш детальні способи вирішити це, але мені подобається простота. Наприклад, я використав вищевказаний шаблон, щоб змусити користувача вийти з програми та потім повернутися до іншої діяльності, яку я вибрав.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.