จะลบล้างปุ่มย้อนกลับของแถบการกระทำใน Android ได้อย่างไร


95

ฉันต้องการปรับแต่งปุ่มย้อนกลับของกิจกรรมในแถบการทำงานไม่ใช่ในปุ่มย้อนกลับแบบฮาร์ดคีย์ ฉันได้ลบล้างonBackPressed()วิธีการ ใช้งานได้กับปุ่มย้อนกลับโปรแกรมจำลองของฉัน แต่ไม่ใช้กับปุ่มย้อนกลับของแถบการกระทำ

ฉันต้องการให้มันเกิดขึ้นด้วยแถบการกระทำ ฉันจะทำเช่นนี้ได้อย่างไร?

นี่คือรหัสของฉัน:

@Override
public void onBackPressed() {
    Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
    return;
}

ฉันใช้ขนมปังปิ้งนี้ไม่ว่าการกดย้อนกลับจะใช้งานได้หรือไม่ แต่การใช้งานจริงเปลี่ยนไปเหมือนกลับไปที่กิจกรรมก่อนหน้า แต่จะใช้ไม่ได้กับปุ่มที่อยู่ด้านบนของแถบการทำงาน (นอกเหนือจากชื่อกิจกรรม)

โปรดคนใดคนหนึ่งสามารถระบุปัญหาให้ฉันได้

คำตอบ:


212

ฉันคิดว่าคุณต้องการลบล้างการคลิกของปุ่มโฮม คุณสามารถแทนที่ฟังก์ชันนี้ในกิจกรรมของคุณได้

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
        break;
    }
    return true;
}

1
โนอาห์อิบราฮิมจริงๆแล้วมีปุ่มย้อนกลับที่มุมซ้ายบนเหมือนปุ่มย้อนกลับในเบราว์เซอร์ เมื่อฉันคลิกที่ปุ่มนั้นฉันต้องการกลับไปที่กิจกรรมก่อนหน้านี้ ไม่เหมือนโค้ดที่คุณโพสต์ไว้ข้างบน
GK

4
เพิ่ม super.onBackPressed (); ไป
redestructa

2
สิ่งนี้ใช้ได้ผลสำหรับฉันหลังจากที่ฉันเปลี่ยนreturn true;เป็นreturn super.onOptionsItemSelected(item). จากนั้นคุณสามารถทำให้บางอย่างเกิดขึ้นได้เมื่อผู้ใช้คลิกปุ่มย้อนกลับของแถบการทำงาน แต่ยังคงฟังก์ชันการทำงานเดิมของปุ่ม
kumaheiyama

ด้วยเทคนิคนี้ปุ่มลูกศรย้อนกลับจะตอบสนองช้า หมายความว่าฉันต้องรอสักครู่เพื่อให้เหตุการณ์เริ่มทำงาน ยังไม่ปรากฏตัวเลือกบนปุ่มนี้สำหรับเอฟเฟกต์ในขณะที่กด
Gopal Singh Sirvi

ไม่ได้ผลสำหรับฉัน เมื่อฉันแก้ไขข้อบกพร่องฉันพบรหัสของปุ่มโฮมและรหัสของปุ่มที่คลิกแตกต่างกัน
viper

46

หากคุณต้องการให้ปุ่มย้อนกลับ ActionBar ทำงานในลักษณะเดียวกับปุ่มย้อนกลับของฮาร์ดแวร์:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home) {
                    onBackPressed();
                    return true;
            }
            return false;
    }

1
กรณีandroid.R.id.homeไม่ยิง
Trancer

2
@Trancer ถ้าคุณใช้ใน Fragment คุณควรเรียกใช้setHasOptionsMenu(true)เมธอด onCreate ของ Fragment ด้วย
wilddev

10

สิ่งที่ควรทราบสองประการคือผู้ใช้สามารถกดปุ่มย้อนกลับหรือกดปุ่มโฮมของแถบการทำงาน
ดังนั้นหากคุณต้องการเปลี่ยนเส้นทางเขาไปยังจุดหมายเดียวกันคุณสามารถทำได้

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
    }
    return false;
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
    startActivity(intent);
    finish();
}

การดำเนินการนี้จะนำผู้ใช้ไปยังจุดประสงค์ที่กดปุ่มใดปุ่มหนึ่งหรือปุ่มแถบการทำงาน


กรณีandroid.R.id.homeไม่ยิง
Trancer

@Trancer เกือบ 1.5+ ปีแล้ว และตอนนี้ฉันไม่ทำ Android แล้ว ฉันช่วยคุณไม่ได้แล้ว ขออภัย.
ssi-anik

แล้วทางออกคืออะไร?
GA1

7
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                       finish();
                   break;
                }
                return true;
        }

2
คุณสามารถเพิ่มเป็นความคิดเห็นได้ มากหรือน้อยก็เหมือนกับคำตอบที่ยอมรับ
Sufian

7

ขออภัยของฉันเป็นคำตอบที่ล่าช้า แต่สำหรับใครก็ตามที่มาถึงหน้านี้ด้วยคำถามเดียวกันฉันได้ลองทำตามข้างต้นแล้ว:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
  ...
  if (item.getItemId() == android.R.id.home) {
    ....
  }
  ....
}

แต่สิ่งนี้ล้มเหลวในการกดปุ่ม "ย้อนกลับ"

ในที่สุดฉันก็พบวิธีการที่เหมาะกับฉันในhttps://stackoverflow.com/a/37185334/3697478ซึ่งจะแทนที่ "onSupportNavigateUp ()" ในขณะที่ฉันใช้แถบการดำเนินการจากไลบรารีการสนับสนุน "AppCompatActivity" (มี "onNavigateUp ()" ที่เทียบเท่าสำหรับไลบรารีแถบการดำเนินการ / แถบเครื่องมือที่ใหม่กว่า)

@Override
public boolean onSupportNavigateUp(){  
  finish();  
  return true;  
}

และฉันลบส่วน "android: parentActivityName =". MainActivity "ออกจากไฟล์รายการ


4

ฉันทำได้สำเร็จโดยใช้เพียงสองขั้นตอน

ขั้นตอนที่ 1: ไปที่ AndroidManifest.xml และเพิ่มพารามิเตอร์ในแท็ก - android: parentActivityName = ". home.HomeActivity"

ตัวอย่าง:

 <activity
    android:name=".home.ActivityDetail"
    android:parentActivityName=".home.HomeActivity"
    android:screenOrientation="portrait" />

ขั้นตอนที่ 2: ใน ActivityDetail ให้เพิ่มการกระทำของคุณสำหรับหน้า / กิจกรรมก่อนหน้า

ตัวอย่าง:

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
       case android.R.id.home:
           onBackPressed();
           return true;
    }
    return super.onOptionsItemSelected(item);
 }

2

หากคุณต้องการกลับไปที่อินสแตนซ์ก่อนหน้าของกิจกรรมโดยการกดปุ่มโฮมของ ActionBar โดยไม่ต้องสร้างใหม่คุณสามารถแทนที่เมธอด getParentActivityIntent เพื่อใช้หนึ่งจากกองหลัง:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public Intent getParentActivityIntent() {
      return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}

แก้ไข:
นอกจากนี้คุณยังสามารถบรรลุผลลัพธ์เดียวกันได้โดย
ตั้งค่าlaunchModeของกิจกรรมหลักของคุณเป็นsingleTop
ดังนั้นตั้งค่าandroid:launchMode="singleTop"เป็นกิจกรรมหลักในรายการของคุณ
หรือคุณสามารถใช้แฟล็ก FLAG_ACTIVITY_CLEAR_TOP กับ UP Intent
การอ้างอิง: การจัดเตรียมการนำทาง


2

(1) เพิ่มกิจกรรมผู้ปกครองสำหรับกิจกรรมของบุตรหลานของคุณ (AndroidManifest.xml)

<activity
        android:name=".ParentActivity" />

(2) แทนที่เมธอด onSupportNavigateUp ภายในกิจกรรมลูก

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return false;
}

0
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }
    //noinspection SimplifiableIfStatement
    if (id == R.id.signIn) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
///////////////////
@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

0

มีหลายวิธีในการตั้งค่าปุ่มย้อนกลับในแถบ:

1) วิธีการ.setDisplayHomeAsUpEnabled(true);จะทำและจากนั้นคุณสามารถลบล้างได้android.R.id.home

2) เพิ่ม<meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />ใน Android Manifest แต่ในกรณีนี้คุณไม่สามารถแทนที่android.R.id.homeใน OnOptionsMenuSelected

.. สำหรับใครที่สงสัยว่าทำไมถึงใช้ไม่ได้ผล ...

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