ฟังก์ชั่น onClick ของ Action Bar สำหรับปุ่มโฮม


85

ฉันจะใช้onClickListenerปุ่มโฮมของ Action Bar แบบกำหนดเองได้อย่างไร

ฉันทำไปแล้วgetSupportActionBar().setDisplayHomeAsUpEnabled(true);และตอนนี้ฉันต้องการเปลี่ยนเส้นทางผู้ใช้ไปยังกิจกรรมบางอย่างในกรณีที่มีการคลิกปุ่มโฮม

ฉันลองใช้:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            item.setOnMenuItemClickListener(new OnMenuItemClickListener() {
                public boolean onMenuItemClick(MenuItem item) {
                    Intent i = new Intent();
                    i.setClass(BestemmingActivity.this, StartActivity.class);
                    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                    return true;
                }
            });
        default:
            return super.onOptionsItemSelected(item);
        }
    }

แต่มันไม่เคยเข้ามาในonMenuItemClick.

โดยทั่วไปจะทำเช่นเดียวกับในลิงค์นี้แต่ยังไม่เข้าสู่ Listener

คำตอบ:


113

หากใครต้องการวิธีแก้ปัญหา

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == android.R.id.home) {
        onBackPressed();  return true;
    }

    return super.onOptionsItemSelected(item);
}

นี่ควรเป็นการละลาย คำตอบที่ดี
jemsnaban

3
ทำงานให้ฉันด้วยreturn true;
Rick

1
ใส่return true;ท้ายifบล็อกแล้วถูกต้อง
androidguy

2
วิธีนี้ใช้ไม่ได้กับปุ่ม Home / Back ที่มีไอคอนลูกศร
Trancer

111

ฉันใช้actionBarSherlockหลังจากที่เราตั้งค่าแล้วsupportActionBar.setHomeButtonEnabled(true);
เราสามารถแทนที่เมธอด onMenuItemSelected:

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {

    int itemId = item.getItemId();
    switch (itemId) {
    case android.R.id.home:
        toggle();

        // Toast.makeText(this, "home pressed", Toast.LENGTH_LONG).show();
        break;

    }

    return true;
}

ฉันหวังว่างานนี้สำหรับคุณ ~~~ โชคดี


4
ไม่ได้ผลกับฉัน ไม่สามารถแทนที่ onMenuItemSelected เป็นขั้นสุดท้าย
Aritra Roy

ด้วยคำอธิบายประกอบ Android เพียงใช้ @OptionsItem (android.R.id.home) โมฆะสาธารณะ yourMethod () {}
Italo Borssatto

23

ถ้าเราใช้แถบการกระทำที่ระบบกำหนดให้ตามโค้ดทำงานได้

getActionBar().setHomeButtonEnabled(true);

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {

    int itemId = item.getItemId();
    switch (itemId) {
    case android.R.id.home:
      //do your action here.
        break;

    }

    return true;
}

7

คงที่: ไม่จำเป็นต้องใช้ไฟล์setOnMenuItemClickListener. เพียงแค่กดปุ่มก็จะสร้างและเปิดกิจกรรมผ่านเจตนา

ขอบคุณทุกคนมากสำหรับความช่วยเหลือของคุณ!


ขวาแถบการทำงานจะดูแลผู้ฟังเมนูและการโทรonOptionsItemSelected()โดยอัตโนมัติ ไม่จำเป็นต้องติดตั้งด้วยตนเอง (ซึ่งสามารถทำลายสิ่งต่างๆได้)
Nikolay Elenkov

5

คำตอบครึ่งส่วนของสิ่งที่เกิดขึ้น ถ้าonOptionsItemSelectedไม่ใช่homeAsUpปุ่มควบคุมเมื่อกิจกรรมหลักตั้งค่าในระบบ manifest.xml ไปที่กิจกรรมหลัก ใช้สิ่งนี้ในแท็กกิจกรรม:

<activity ... >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.activities.MainActivity" /> 
</activity>

3

คุณต้องเปิดใช้งานโฮมแอ็คชันอย่างชัดเจนหากทำงานบน ICS จากเอกสาร :

หมายเหตุ: หากคุณกำลังใช้ไอคอนเพื่อนำทางไปยังกิจกรรมในบ้านโปรดระวังว่าเริ่มต้นด้วย Android 4.0 (API ระดับ 14) คุณต้องเปิดใช้งานไอคอนเป็นรายการการดำเนินการอย่างชัดเจนโดยเรียกใช้ setHomeButtonEnabled (true) (ในเวอร์ชันก่อนหน้านี้ ไอคอนถูกเปิดใช้งานเป็นรายการการทำงานโดยค่าเริ่มต้น)


3
ฉันทำ a getSupportActionBar().setDisplayHomeAsUpEnabled(true);และ agetSupportActionBar().setHomeButtonEnabled(true);
noloman แล้ว


-4

คุณควรลบ Override onOptionsItemSelected และทำซ้ำ onCreateOptionsMenu ของคุณด้วยรหัสนี้

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_action_bar_finish_order_stop, menu);
        menu.getItem(0).setOnMenuItemClickListener(new FinishOrderStopListener(this, getApplication(), selectedChild));
        return true;

    }

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