Вимкнути кнопку "назад" в Android


334

Як відключити кнопку назад в android під час виходу з програми?


1
Чи можете ви бути трохи більш зрозумілими в питанні? Якщо ви хочете перезаписати поведінку за замовчуванням на кнопку "Назад", перегляньте це питання тут. stackoverflow.com/questions/2000102/…
Gopinath

26
Будь ласка, не робіть цього, якщо у вас немає вагомих причин, оскільки розбивання очікуваної моделі роботи дуже трохи зашкодить всій платформі
Hamy

14
Ви б хотіли це зробити, якщо вам доведеться мати справу з дурним Samsung S4, де кнопка "назад" є сенсорною (не фізичною), прямо на краю телефону, яка вже настільки чутлива до дотику, що долоня, що спирається на бік, буде Повертайся.
часник

Відповіді:


651

Замініть метод onBackPress і не робіть нічого, якщо ви мали намір обробити кнопку "назад" на пристрої.

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

12
Це набагато краще і чіткіше, ніж перекриття методів обробки ключів, і має той же ефект. Чудова відповідь!
Нік Рейман

2
Чудове рішення чувак. Чи є спосіб зробити це за допомогою кнопки будинку?
Датта Кунде

1
Це чудово! Насправді я хотів завжди повертатися до своєї основної діяльності при натисканні назад від будь-якої іншої діяльності, і переосмислення цього методу дозволяє мені це робити дуже легко.
Джим

На жаль, я забуваю видалити super.onBackPress ().
Арісто Майкл

173

Якщо шукати вищий рівень api 2.0 і вище, це буде чудово працювати

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

Якщо шукаєте андроїд 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
Цей метод є більш сумісним назад, ніж використання в режимі onbackpress через вимогу рівня api для onbackpress
AndrewPK

5
Чудова відповідь. Хоча мені це не потрібно для мого проекту, я вдячний, що ви надали і старі, і нові методи. Це слід позначити як правильну відповідь. +1
Джим

1
@Javanator другий не буде працювати для мене (наприклад, для рівня 16 API), але перший працює як шарм
noloman

38

Це можна зробити простим способом. Не дзвоніть на super.onBackPress ()

Примітка. - Не робіть цього, доки не будете мати вагомих причин для цього.

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

6
Пояснення "чому ні" було б чудово. Дякую.
майже початківець

Не викликати .super важливо!
Ран

3
@almostabeginner, тому що, якщо не викликати супер, це призведе до недійсного нормального використання кнопки "назад". користувачі відлякують, коли нормально працююча кнопка перестане працювати. вони можуть подумати, що додаток баггі або телефон несправний, і т. д. ваш додаток стане винуватцем в кінцевому підсумку.
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 вийшла з якогось сервера, перш ніж ваша активність буде вбита, -> вийдіть із сервісом на власному потоці (це ви все одно повинні робити).

Вимкнення кнопки "назад" нічого не вирішить для вас. У вас все ще буде така ж проблема, коли, наприклад, користувач отримає телефонний дзвінок. Коли телефонний дзвінок надійде, у вашої діяльності є стільки ж шансів на смерть, перш ніж вона отримає надійну відповідь від мережі.

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


8

Просто перекрийте метод onBackPress () і не потрібно викликати суперклас методу onBackPress або ін.

@Override
public void onBackPressed()
{

}

Або передайте свою поточну активність методу onBackPress ().

@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.OnBackPress ();

@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

Окремо сформуйте ці два методи з відповіді вище.

onBackPress () (Рівень API 5, Android 2.0)

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

Ви також можете змінити dispatchKeyEvent()(API рівня 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.