Как обращаться с кнопкой «назад» в действии

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

Вы можете справиться с этим так:

для 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
Как насчет фрагментов?
Крушман
1
Да, кто-нибудь знает, как сделать это из фрагмента
Джеймс Вежба
3
@ james-wierzba обрабатывает действия и делегирует обработку фрагмента
Григорий Чуднов
19

В дополнение к вышесказанному я лично рекомендую

onKeyUp():

Programatically Говоря KeyDown будет срабатывать , когда пользователь нажимает клавишу изначально , но это будет повторяться , пока пользователь удерживает клавишу нажатой. *

Это остается верным для всех платформ разработки.

Разработчики Google предложили, что если вы перехватываете кнопку BACK в представлении, вы должны отслеживать KeyEvent с помощью starttracking on keydown, а затем вызывать с 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();

}

Ура!

С Брюс
источник
Я использовал финиш, и он не возвращается к предыдущему действию.
Si8
2
"finish ()" закрывает только вашу текущую активность. Вы должны справиться с возвратом к предыдущей активности с помощью намерения. Кстати, ваше предыдущее действие все еще должно быть открыто, если вы не «завершили ()» его при переходе от него ранее.
С Брюс
Я проверяю что-то и обновлю вас. Спасибо за ответ.
Si8
1
Просто используйте super.onBackPressed () вместо finish ()
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 появился новый метод 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 (например, вы можете добавить частный int с именем ECLAIR)

neteinstein
источник
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();

}

Я надеюсь, что это поможет вам .. :)

Shubham
источник
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();
        }

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

Эдди Тауэрс
источник