Отключить кнопку назад в Android


334

Как отключить кнопку возврата в Android при выходе из приложения?


1
Можете ли вы быть немного более ясным по этому вопросу? Если вы хотите перезаписать поведение кнопки «Назад» по умолчанию, обратитесь к этому вопросу здесь. stackoverflow.com/questions/2000102/…
Гопинатх

26
Пожалуйста, не делайте этого, если у вас нет веских причин, так как нарушение ожидаемой модели работы очень незначительно повреждает всю платформу
Hamy

14
Вы захотите сделать это, если вам придется иметь дело с глупым Samsung S4, где кнопка «назад» чувствительна к прикосновениям (не физическая), прямо на краю телефона, которая уже настолько чувствительна к прикосновениям, что ладонь, прислоненная к боковой поверхности, будет вернитесь назад.
чеснок

1
Это противоречит руководству по качеству и дизайну Android , роль UX-N1.
MiguelSlv

Ответы:


651

Переопределите метод onBackPressed и ничего не делайте, если вы хотите обработать кнопку возврата на устройстве.

@Override
public void onBackPressed() {
   if (shouldAllowBack()) {
       super.onBackPressed();
   } else {
       doSomething();
   }
}

12
Это намного лучше и чище, чем переопределение ключевых методов обработки, и имеет тот же эффект. Отличный ответ!
Ник Рейман

2
Отличное решение, чувак. Есть ли способ сделать это с помощью кнопки домой?
Датта Кунде

1
Это круто! Я на самом деле хотел всегда возвращаться к своей основной деятельности, когда отжимался от любой другой активности, и переопределение этого метода позволяет мне сделать это очень легко.
Джим

К сожалению, я забыл удалить super.onBackPressed ().
Аристо Майкл

173

Если вы ищете более высокий уровень API 2.0 и выше, это будет отлично работать

@Override
public void onBackPressed() {
    // Do Here what ever you want do on back press;
}

Если вы ищете Android API уровня до 1.6.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_BACK) {
     //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR
     return true;
     }
     return super.onKeyDown(keyCode, event);    
}

Запишите вышеуказанный код в свою активность, чтобы предотвратить нажатие кнопки «назад»


5
Этот метод более обратно совместим, чем использование onbackpressed из-за требования api-уровня
onbackpressed

5
Отличный ответ. Хотя мне это не нужно для моего проекта, я ценю, что вы предоставили как старые, так и новые методы. Это должно быть помечено как правильный ответ. +1
Джим

1
@Javanator второй не будет работать для меня (например, для API уровня 16), но первый работает как шарм
noloman

38

Вы можете сделать это простым способом. Не вызывайте super.onBackPressed ().

Примечание: - Не делайте этого до тех пор, пока у вас нет веских причин для этого.

@Override
public void onBackPressed() {
// super.onBackPressed();
// Not calling **super**, disables back button in current screen.
}

6
Объяснение "почему бы и нет" было бы здорово. Спасибо.
почти новичок

Не звонить .super важно!
Ран

3
@almostabeginner, потому что не вызывая super, нарушит нормальное использование кнопки назад. пользователи будут волноваться, когда нормально работающая кнопка перестанет работать. они могут подумать, что приложение глючит или телефон работает со сбоями и т. д. Ваше приложение в конечном итоге станет виновником.
bengongon97


13

Я использую это .............

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK)
        Toast.makeText(getApplicationContext(), "back press",      
     Toast.LENGTH_LONG).show();

    return false;
       // Disable back button..............
}

9

Если вы хотите убедиться, что ваше клиентское приложение для Android вышло из системы с какого-либо сервера до того, как ваша активность будет уничтожена -> выйдите из службы со своим собственным потоком (это то, что вы должны делать в любом случае).

Отключение кнопки «назад» ничего не решит для вас. У вас все равно будет та же проблема, когда пользователь, например, получит телефонный звонок. Когда телефонный звонок получен, ваша активность имеет столько же шансов быть убитым, чем получить надежный ответ из сети.

Вот почему вы должны позволить службе ждать в своем потоке ответа от сети, а затем повторить попытку, если это не удастся. Служба Android не только намного менее вероятна, чтобы ее убили, прежде чем она получит ответ, но и если она действительно будет убита до завершения работы, то AlarmManager всегда может восстановить ее, чтобы попытаться снова.


8

Просто переопределите метод onBackPressed () и не нужно вызывать суперкласс метода onBackPressed или другие.

@Override
public void onBackPressed()
{

}

Или передайте текущую активность в метод onBackPressed ().

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

Замените название требуемой активности на myActivity.

если вы используете фрагмент, то сначала вызовите метод callParentMethod ()

public void callParentMethod(){
    context.onBackPressed(); // instead of context use getActivity or something related
}

затем вызовите пустой метод

@Override
public void onBackPressed()
{

}

6

если вы используете FragmentActivity. тогда делай так

Первый вызов Это внутри вашего Fragment.

public void callParentMethod(){
    getActivity().onBackPressed();
}

а затем вызовите onBackPressedметод в стороне вашего родительского FragmentActivityкласса.

@Override
public void onBackPressed() {
  //super.onBackPressed();
  //create a dialog to ask yes no question whether or not the user wants to exit
  ...
}

5

Просто с помощью этого кода: Если вы хотите отключить обратную связь, вы не используете super.OnBackPressed ();

@Override
public void onBackPressed() {

}

4

Если вы хотите отключить приложение во время выхода из системы, вы можете открыть диалоговое окно, которое нельзя отменить.


4

Вы можете переопределить onBackPressed()метод в своей деятельности и удалить вызов суперкласса.

@Override
public void onBackPressed() {
  //remove call to the super class
  //super.onBackPressed();
}

3

Вам просто нужно переопределить метод для кнопки назад. Вы можете оставить метод пустым, если хотите, чтобы при нажатии кнопки «назад» ничего не происходило. Пожалуйста, посмотрите на код ниже:

@Override
public void onBackPressed() 
{
   // Your Code Here. Leave empty if you want nothing to happen on back press.
}

3

Помимо этих двух методов из ответа выше.

onBackPressed () (уровень API 5, Android 2.0)

onKeyDown () (Уровень API 1, Android 1.0)

Вы также можете переопределить dispatchKeyEvent()(API Level 1, Android 1.0) следующим образом:

dispatchKeyEvent() (Уровень API 1, Android 1.0)

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    // TODO Auto-generated method stub
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
        return true;
    }
    return super.dispatchKeyEvent(event);
}


2

Для меня просто переопределение onBackPressed()не сработало, но явно указало, с какого действия оно должно начинаться:

@Override
public void onBackPressed(){
  Intent intent = new Intent(this, ActivityYouWanToGoBack.class);
  startActivity(intent);
}

1

Попробуй это:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK) {

   return true;
 }
   return super.onKeyDown(keyCode, event);    
}

1

снимаю super.onBackPressed()с public void onBackPressed()работы отлично. его проверено в Android 9

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.