Vô hiệu hóa nút quay lại trong Android


332

Làm cách nào để tắt nút quay lại trong Android khi đăng xuất ứng dụng?


1
Bạn có thể rõ ràng hơn một chút về câu hỏi? Nếu bạn đang tìm cách ghi đè hành vi mặc định của nút quay lại thì hãy tham khảo câu hỏi này tại đây. stackoverflow.com/questions/2000102/
trộm

26
Xin đừng làm điều này trừ khi bạn có lý do chính đáng, vì phá vỡ mô hình hoạt động dự kiến ​​sẽ làm tổn thương rất nhẹ toàn bộ nền tảng
Hamy

14
Bạn sẽ muốn làm điều đó nếu bạn phải đối phó với một chiếc Samsung S4 ngu ngốc, nơi nút quay lại có cảm ứng nhạy cảm (không phải vật lý), ngay trên cạnh của điện thoại, vốn đã nhạy cảm đến mức lòng bàn tay tựa vào cạnh sẽ quay lại.
tỏiman

Câu trả lời:


650

Ghi đè phương thức onBackPression và không làm gì nếu bạn muốn xử lý nút quay lại trên thiết bị.

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

12
Điều này tốt hơn và sạch hơn nhiều so với ghi đè các phương thức xử lý chính và có tác dụng tương tự. Câu trả lời chính xác!
Nik Reiman

2
Giải pháp tuyệt vời anh chàng. Có cách nào để làm như thế này với nút home không?
Datta Kunde

1
Điều đó thật tuyệt! Tôi thực sự muốn luôn luôn quay trở lại hoạt động chính của mình khi nhấn lại từ bất kỳ hoạt động nào khác và việc ghi đè phương thức này cho phép tôi thực hiện điều đó rất dễ dàng.
Jim

Rất tiếc, tôi quên xóa super.onBackPression ().
Aristo Michael

172

Nếu tìm kiếm một api cấp 2.0 cao hơn và cao hơn thì điều này sẽ hoạt động rất tốt

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

Nếu tìm kiếm cấp độ api Android lên đến 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);    
}

Viết mã ở trên trong Hoạt động của bạn để ngăn nút quay lại


5
Phương pháp này tương thích ngược hơn so với sử dụng onbackpressed do yêu cầu cấp độ api của
onbackpressed

5
Câu trả lời chính xác. Mặc dù tôi không cần nó cho dự án của mình, tôi đánh giá cao rằng bạn đã cung cấp cả phương pháp cũ và phương pháp mới. Điều này nên được đánh dấu là câu trả lời đúng. +1
Jim

1
@Javanator cái thứ hai sẽ không hoạt động với tôi (ví dụ: API cấp 16), nhưng cái thứ nhất hoạt động như một bùa mê
noloman

38

Bạn có thể làm theo cách đơn giản này Đừng gọi super.onBackPression ()

Lưu ý: - Đừng làm điều này trừ khi và cho đến khi bạn có lý do mạnh mẽ để làm điều đó.

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

6
Một lời giải thích như "tại sao không" sẽ là tuyệt vời. Cảm ơn.
gần như là người mới bắt đầu

Không gọi .super là quan trọng!
Ran

3
@al Maximumabeginner vì không gọi siêu sẽ làm mất hiệu lực sử dụng nút quay lại thông thường. Người dùng sẽ bối rối khi một nút hoạt động bình thường ngừng hoạt động. họ có thể nghĩ rằng ứng dụng bị lỗi hoặc điện thoại bị trục trặc, v.v ... cuối cùng ứng dụng của bạn sẽ là thủ phạm.
bengongon97

22

Chỉ cần ghi đè phương thức onBackPression () .

@Override
public void onBackPressed() { }

13

Tôi đang sử dụng nó.............

 @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

Nếu bạn muốn đảm bảo ứng dụng máy khách Android của bạn được đăng xuất khỏi một số máy chủ trước khi Hoạt động của bạn bị giết -> đăng xuất với một dịch vụ trên luồng của chính nó (đó là những gì bạn phải làm dù sao).

Vô hiệu hóa nút quay lại sẽ không giải quyết được gì cho bạn. Bạn vẫn sẽ gặp vấn đề tương tự khi người dùng nhận được một cuộc gọi điện thoại chẳng hạn. Khi nhận được một cuộc gọi điện thoại, hoạt động của bạn có nhiều khả năng bị giết trước khi nhận được câu trả lời đáng tin cậy từ mạng.

Đó là lý do tại sao bạn nên để một dịch vụ chờ đợi chủ đề của chính nó cho câu trả lời từ mạng và sau đó làm cho nó thử lại nếu nó không thành công. Dịch vụ Android không chỉ ít có khả năng bị giết trước khi nhận được câu trả lời, mà nếu nó thực sự bị giết trước khi hoàn thành công việc, nó luôn có thể được hồi sinh bởi AlertManager để thử lại.


8

Chỉ cần ghi đè phương thức onBackPression () và không cần gọi siêu hạng của phương thức onBackPression hoặc các phương thức khác ..

@Override
public void onBackPressed()
{

}

Hoặc chuyển hoạt động hiện tại của bạn vào phương thức onBackPression ().

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

Thay thế tên hoạt động yêu cầu của bạn thành myActivity.

nếu bạn đang sử dụng phân đoạn thì trước hết hãy gọi phương thức callParentMethod ()

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

sau đó gọi phương thức rỗng

@Override
public void onBackPressed()
{

}

6

nếu bạn đang sử dụng FragmentActivity. sau đó làm như thế này

cuộc gọi đầu tiên này bên trong của bạn Fragment.

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

và sau đó gọi onBackPressedphương thức bên cạnh FragmentActivitylớp cha của bạn .

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

5

Chỉ sử dụng mã này: Nếu bạn muốn vô hiệu hóa ngược, bạn không sử dụng super.OnBackPression ();

@Override
public void onBackPressed() {

}

4

Nếu bạn muốn tắt ứng dụng của mình trong khi đăng xuất, bạn có thể bật lên hộp thoại không thể hủy.


4

Bạn có thể ghi đè onBackPressed()phương thức trong hoạt động của mình và xóa cuộc gọi đến siêu hạng.

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

3

Bạn chỉ cần ghi đè phương thức cho nút quay lại. Bạn có thể để trống phương thức nếu bạn muốn để không có gì xảy ra khi bạn nhấn nút quay lại. Xin vui lòng xem mã dưới đây:

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

3

Ngoài hình thức hai phương pháp này từ câu trả lời ở trên.

onBackPression () (API cấp 5, Android 2.0)

onKeyDown () (API cấp 1, Android 1.0)

Bạn cũng có thể ghi đè dispatchKeyEvent()(API cấp 1, Android 1.0) như thế này,

dispatchKeyEvent() (API cấp 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);
}

3

Vô hiệu hóa mông lại trong Android

@Override
public void onBackPressed() {
    return;
}

2

Đối với tôi chỉ ghi đè onBackPressed()không hoạt động nhưng chỉ rõ hoạt động nào nên bắt đầu hoạt động tốt:

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

1

Thử cái này:

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

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

1

loại bỏ super.onBackPressed()khỏi public void onBackPressed()công việc tuyệt vời. nó đã được thử nghiệm trong Android 9

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.