ปิดการใช้งานปุ่มย้อนกลับใน Android


334

วิธีการปิดการใช้งานปุ่มย้อนกลับใน Android ในขณะที่ออกจากระบบแอปพลิเคชัน?


1
คุณจะเข้าใจคำถามได้ชัดเจนขึ้นหรือไม่? หากคุณกำลังมองหาการเขียนทับพฤติกรรมเริ่มต้นของปุ่มย้อนกลับแล้วโปรดดูคำถามนี้ที่นี่ stackoverflow.com/questions/2000102/…
Gopinath

26
โปรดอย่าทำเช่นนี้จนกว่าคุณจะมีเหตุผลที่ดีเนื่องจากการทำลายรูปแบบการทำงานที่คาดไว้จะทำให้ทั้งแพลตฟอร์มเจ็บปวดเล็กน้อย
Hamy

14
คุณต้องทำถ้าคุณต้องจัดการกับ Samsung S4 ที่ปุ่มย้อนกลับเป็นแบบสัมผัสที่อ่อนไหว (ไม่ใช่ทางกายภาพ) ขวาที่ขอบของโทรศัพท์ซึ่งสัมผัสแล้วไวที่ฝ่ามือจะอยู่ด้านข้าง กลับไป.
garlicman

1
มันเป็นกับคู่มือคุณภาพและการออกแบบ Android , บทบาท UX-N1
MiguelSlv

คำตอบ:


651

แทนที่เมธอด onBackPressed และไม่ทำอะไรเลยถ้าคุณตั้งใจจะจัดการกับปุ่มย้อนกลับบนอุปกรณ์

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

12
นี่เป็นวิธีที่ดีกว่าและสะอาดกว่าการเอาชนะวิธีการจัดการกุญแจและมีผลเหมือนกัน คำตอบที่ดี!
Nik Reiman

2
ทางออกที่ดีครับ มีวิธีทำเช่นนี้ด้วยปุ่มหน้าแรกหรือไม่?
Datta Kunde

1
มันเยี่ยมมาก! จริง ๆ แล้วฉันต้องการกลับไปที่กิจกรรมหลักของฉันเสมอเมื่อกดกลับจากกิจกรรมอื่น ๆ และการเอาชนะวิธีนี้ทำให้ฉันทำได้ง่ายมาก
จิม

โอ๊ะฉันลืมลบ super.onBackPressed ()
Aristo Michael

173

หากกำลังมองหา api ระดับสูงกว่าและสูงกว่านี้จะได้ผลดี

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

หากกำลังมองหา android api level ไม่เกิน 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) แต่คนแรกที่ทำงานเหมือน
เครื่องราง

38

คุณสามารถทำสิ่งนี้ได้ง่ายๆอย่าเรียก super.onBackPressed ()

หมายเหตุ: - อย่าทำอย่างนี้จนกว่าคุณจะมีเหตุผลอันสมควรที่จะทำ

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

6
คำอธิบายเกี่ยวกับ "ทำไมไม่" จะดี ขอบคุณ
ผู้เริ่มต้นเกือบ

ไม่โทร. super เป็นสิ่งสำคัญ!
Ran

3
@albababinner เนื่องจากการไม่เรียก 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 () และไม่จำเป็นต้องเรียกคลาส super ของเมธอด 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

เพียงแค่ใช้รหัสนี้: หากคุณต้องการปิดการใช้งาน backpressed คุณไม่ต้องใช้ 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 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.