แถบการทำงานของ Android ไม่แสดงการล้น


90

ฉันมีแถบการทำงานในแอปของฉันซึ่งมี 3 รายการ

แสดงได้เพียง 2 อันเนื่องจากปัญหาพื้นที่ดังนั้นฉันคาดหวังว่ารายการแรกจะปรากฏและส่วนที่เหลือจะแสดงในรายการที่ล้น อย่างไรก็ตามในทางปฏิบัติจะแสดงเพียง 2 รายการแรกเท่านั้นและไม่มีการตรวจจับการล้น

นี่คือรหัสที่เกี่ยวข้อง: list_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_insert"
    android:icon="@android:drawable/ic_menu_add"
    android:title="@string/menu_insert" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_call"
    android:icon="@android:drawable/ic_menu_call"
    android:title="@string/menu_call" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_agenda"
    android:icon="@android:drawable/ic_menu_agenda"
    android:title="@string/menu_agenda" 
    android:showAsAction="ifRoom|withText"/>
</menu>

Activity.java

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.list_menu, menu);
    return true;
}

120
หากอุปกรณ์ของคุณมีปุ่มเมนูไอคอนล้นจะไม่แสดง คุณใช้อุปกรณ์อะไร
Reinier

1
อุปกรณ์เสมือนที่ฉันกำลังทดสอบอยู่มีปุ่มเมนูจริง ๆ คลิกที่มันและรายการที่หายไปปรากฏขึ้นขอบคุณ!
Mats Raemen

2
@ รีเนียร์ฉันใช้ ActionBarSherlock บน Galaxy Ace ที่รัน 2.3 จะแสดงบน Galaxy SII ที่รัน 4.0 จะไม่แสดง ทั้งสองมีปุ่มเมนู HW
Mister Smith

2
ฉันต้องการยืนยันว่าสิ่งนี้ทำให้ฉันงุนงงว่าฉันมีไอคอนล้นบน nexus 7 ไม่ได้ซื้อใน Galaxy Note II โน้ตมีปุ่มเมนู ขอบคุณ!
bsautner

@ รีเนียร์โปรดช่วยฉันประสบปัญหาเดียวกันฉันควรทำอย่างไร?
Rupesh

คำตอบ:


125

หากคุณต้องการแสดงจุดสามจุดโดยไม่คำนึงถึงปุ่มเมนูของอุปกรณ์! จากนั้นคุณสามารถเรียกเมธอดนี้ในคลาสแอปพลิเคชันของคุณ 'onCreate method-

private void makeActionOverflowMenuShown() {
    //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
    try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if (menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}

32
นี่เป็นการแฮ็กที่น่ากลัวที่ทำลายความสอดคล้องกับแอพอื่น ๆ บนแพลตฟอร์ม อย่าทำอย่างนี้.
adamp

19
ดูเหมือนว่าความชั่วร้ายน้อยกว่าสองประการ พฤติกรรมปัจจุบันเป็นสิ่งที่ยอมรับไม่ได้
biorbnA

6
เป็นวิธีที่ดีในการอนุญาตให้มีการล้นไม่ควรใช้ฮาร์ดคีย์ของเมนูอีกต่อไป
Necronet

5
ใช้งานได้ดีมาก! ใช้งานได้แม้ว่าผู้ใช้จะกดปุ่มเมนูฮาร์ดแวร์ (ซึ่งยอดเยี่ยมมาก) แม้ว่าคุณจะได้ยินเสียงเมนูสองครั้งก็ตาม .. มีใครรู้วิธีทำให้เสียงเพียงครั้งเดียว?
Bruce

5
นี่ไม่ใช่แฮ็ค นักพัฒนาจำเป็นต้องรู้ว่าจะเรียกแฮ็กอะไรเพราะมันไม่ใช่ 2 + 2 ใน Android การสะท้อนกลับช่วยประหยัดเวลาโดยใช้กลไก Java หรือมิฉะนั้นคุณจะส่งบริบทไปยังคลาสภายในของคุณตลอด 24 ชั่วโมงทุกวันหรือปรับแต่ง AOSP เป็นอินฟินิตี้ สำหรับฉันวิธีนี้ช่วยแก้ปัญหาในการลบล้างและรวมเนื้อหาที่กำหนดเอง AOSP จำนวนมากและเชื่อมโยงการเชื่อมโยงส่วนตัวเพื่อประโยชน์ของสิ่งที่คนเจ้าระเบียบคิดว่าสะอาด คุณทราบหรือไม่ว่าคุณไม่สามารถบังคับให้เปิดใช้ FASTSCROLL อย่างสม่ำเสมอสำหรับรายการขนาดเล็กได้ ก่อนที่ฉันจะใช้การไตร่ตรองสิ่งนี้ทำให้ฉันต้องคัดลอกทรัพยากร 10+ AOSP สำหรับการแก้ไขหนึ่งครั้ง
leRobot

53

แถบการกระทำ

res / menu / menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Search / will display always -->
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="always"
        android:title="@string/action_search"/>

    <!-- Location Found -->
    <item
        android:id="@+id/action_location_found"
        android:icon="@drawable/ic_action_location_found"
        android:showAsAction="always"
        android:title="@string/action_location_found"/>

    <!-- More -->
    <item
        android:id="@+id/a_More"
        android:icon="@drawable/ic_action_overflow"
        android:showAsAction="always"
        android:title="More">
        <menu>

            <!-- Refresh -->
            <item
                android:id="@+id/action_refresh"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_refresh"/>

            <!-- Help -->
            <item
                android:id="@+id/action_help"
                android:icon="@drawable/ic_action_help"
                android:showAsAction="never"
                android:title="@string/action_help"/>

            <!-- Check updates -->
            <item
                android:id="@+id/action_check_updates"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_check_updates"/>
        </menu>
    </item>

</menu>

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

}

ดาวน์โหลดชุดไอคอนแถบการดำเนินการ


2
ลองดูความคิดเห็นของ @Reinier เป็นเรื่องจริง "หากอุปกรณ์ของคุณมีปุ่มเมนูไอคอนล้นจะไม่แสดง"
Ahmad Dwaik 'Warlock'

ฉันทดสอบในอุปกรณ์ที่มีปุ่มเมนูและมีการล้นปรากฏขึ้น ฉันใช้android:showAsAction="always"สำหรับรายการเพิ่มเติม
Kirit Vaghela

คุณได้ทดสอบอุปกรณ์ใดบ้าง ฉันใช้ neo v xperia และ s #
Ahmad Dwaik 'Warlock'

1
หมายเหตุ: รายการของคุณที่ทำให้เมนูล้นของคุณต้องแสดง AsAction = "always"
Kirit Vaghela

1
showAsAction ไม่มีในเนมสเปซ Android ใน SDK รุ่นเก่า ไปที่ลิงค์นี้developer.android.com/training/basics/actionbar/…เพื่อเอาชนะสิ่งนี้ หลังจากเพิ่ม NS schemas.android.com/apk/res-autoแล้วเคล็ดลับข้างต้นก็ใช้ได้ผลดีสำหรับฉัน
chedine

42

ฉันรู้ว่านี่ไม่ใช่เมนูล้น แต่มันคล้ายกัน โอเคนี่เป็นเรื่องง่าย แต่ยากที่จะเข้าใจ

ก่อนอื่นคุณต้องมีรายการเมนูที่คุณต้องการใช้เป็นพองลม ตัวอย่าง

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>

เมื่อคุณมีรายการของคุณแล้วให้เพิ่มเมนูย่อยที่มีรายการของคุณที่คุณต้องการในเมนูรายการเพิ่มเติม ตัวอย่าง:

<item
    android:id="@+id/a_More"
    android:icon="@drawable/more"
    android:showAsAction="always"
    android:title="More">
    <menu>
        <item
            android:id="@+id/aM_Home"
            android:icon="@drawable/home"
            android:title="Home"/>
    </menu>
</item>

เมื่อคลิกสิ่งนี้จะขยายรายการอื่น ๆ ภายใน แอปพลิเคชันของฉันใช้ ActionBarSherlock 4.0 ดังนั้นก่อนที่จะใช้งานได้คุณจะต้องเข้าถึง "SplitActionBar" (จะยังคงทำงานบนแถบการดำเนินการ Android เริ่มต้น)

มีวิธีการดังนี้: ในไฟล์ AndroidManifest.xml ของคุณคุณต้องเพิ่มรหัสนี้ภายใต้กิจกรรมที่คุณต้องการในเมนูรายการเพิ่มเติม

android:uiOptions="splitActionBarWhenNarrow"

หมายเหตุ:รายการของคุณที่ขยายเมนูล้นต้องshowAsAction="always"

โวล่า! คุณมีเมนูล้น! หวังว่าฉันจะช่วยคุณได้ :)


3
ทางออกที่ดีดีกว่าการแฮ็กปุ่มเมนู
ol0

26

บนอุปกรณ์ที่มีปุ่มเมนูฮาร์ดแวร์ (Galaxy S3 ดื้อเหมือน Samsung ... ) เมนูล้นจะทำงานเป็นเมนู 'ดั้งเดิม' โดยใช้ปุ่มเมนูฮาร์ดแวร์


2
คำตอบเก่าอย่างไรก็ตามเมื่อใช้ไลบรารีความเข้ากันได้สะดุดกับผลลัพธ์ที่แปลกมาก: อุปกรณ์ 3 เครื่องที่มีปุ่มฮาร์ดแวร์, หมายเหตุ 3 Neo = เมนูล้นจะปรากฏขึ้น, ปุ่มเมนูไม่ทำงาน, หมายเหตุ 1 = ไม่ล้น, ปุ่มเมนูใช้งานได้, Galaxy S3, ไม่ ล้นปุ่มเมนูไม่ทำงาน! มันบ้าไปแล้ว.
3c71

5

เมื่อคุณพูดว่าเมนู "ล้น" คุณหมายถึงจุดสามจุดที่ปรากฏขึ้นท้ายเพื่อบ่งชี้ว่ามีรายการเพิ่มเติม .... หรือคุณหมายถึงแถบการทำงานแยกที่แสดงที่ด้านล่างสำหรับรายการล้น

หากคุณหมายถึงแถบการดำเนินการแยกคุณควรเพิ่มสิ่งนี้ลงในไฟล์รายการกิจกรรมของคุณ

android:uiOptions="splitActionBarWhenNarrow"

ตามค่าเริ่มต้นเมนูล้นสามจุดควรเกิดขึ้นโดยอัตโนมัติดังนั้นจึงยากที่จะบอกได้ว่าปัญหาเกิดจากข้อมูลที่คุณให้ไว้ข้างต้น


ฉันหมายถึงจุดสามจุด ไม่ใช่ว่าเป็นเพราะสิ่งของเพราะเมื่อใดก็ตามที่มีการเปลี่ยนแปลงรายการตามคำสั่งไอคอนจะแสดง 2 ไอคอนแรก
Mats Raemen

ฉันควรให้ข้อมูลเพิ่มเติมเพื่อให้สามารถระบุปัญหาที่แท้จริงได้หรือไม่
Mats Raemen

minSdkVersion, targetSdkVersion และเวอร์ชันที่คุณกำลังทดสอบคืออะไร
Sparky

5
อุปกรณ์ของคุณมีปุ่มทางกายภาพสำหรับเมนูหรือเป็นปุ่มเสมือนจริงเช่นโทรศัพท์ galaxy nexus หรือไม่? ฉันคิดว่าจุดสามจุดจะปรากฏขึ้นก็ต่อเมื่อโทรศัพท์ของคุณไม่มีปุ่มกด
wnafee

5

ในการแสดงแอคชั่นโอเวอร์โฟลว์ (สามจุด) บน actionbarcompat:
ในไฟล์เมนูเช่น
main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_about"
        android:title="@string/action_about"
        app:showAsAction="never"/>

</menu>

และในไฟล์กิจกรรม:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

มันใช้งานได้ดีสำหรับฉัน
ทดสอบกับ Google Nexus S, Samsung S3


3

ดูเหมือนว่าบนอุปกรณ์ที่มีปุ่มเมนูเมนูรายการเพิ่มเติมจะไม่แสดงใน ActionBar นอกจากนี้เรายังไม่มีทางทราบว่าอุปกรณ์มีปุ่มเมนูฮาร์ดแวร์ก่อน API ระดับ 14 (4.0+) หรือไม่

โซลูชันนี้จะเพิ่มปุ่มล้นลงในปุ่มandroid.support.v7.app.ActionBarที่เปิดเมนูตัวเลือกมาตรฐานบน Pre-Honeycomb (<3.0) เท่านั้นมิฉะนั้นจะปล่อยให้อยู่ในระบบ ไม่ว่าในกรณีใดคุณสามารถเลือกระหว่างalwaysหรือifRoomสำหรับการกระทำทั้งหมด

รับไอคอนล้นจากการกระทำบาร์ไอคอนแพ็ค

เพิ่มเมนู (ฉันกำลังใส่ส่วนที่ไม่เกี่ยวข้องเป็นชื่อเรื่องการสั่งซื้อ ฯลฯ )

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/action_overflow"
    android:orderInCategory="100"
    android:icon="@drawable/ic_action_overflow"
    app:showAsAction="always" />

<item
    android:id="@+id/action_first"
    app:showAsAction="always" />

<item
    android:id="@+id/action_second"
    app:showAsAction="ifRoom" />

</menu>

ลบการกระทำล้นของเราใน 3.0+

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        menu.removeItem(R.id.action_overflow);
    }
    return super.onPrepareOptionsMenu(menu);
}

สุดท้ายเรียกActivity.openOptionsMenu()จากการดำเนินการมากเกินไป

เอ่อ ... ไม่นะ คุณไม่สามารถโทรopenOptionsMenu()จากปุ่มเมนู ... แต่ถ้าคุณใช้AndroidAnnotationsคุณก็ทำได้อย่างง่ายดาย:

@OptionsItem
void action_overflow() {
    openOptionsMenuDeferred();
}

@UiThread
void openOptionsMenuDeferred() {
    openOptionsMenu();
}

ถ้าไม่ใช่คุณควรทำอะไรแบบนี้ฉันคิดว่า

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == id.action_overflow) {
        openOptionsMenuDeferred();
        return true;
    }
}

private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
    handler.post(new Runnable() {
        @Override
        public void run() {
            openOptionsMenu();
        }
    }
    );
}


2

ใส่xmlns:your_app_name="http://schemas.android.com/apk/res-auto"แท็กเมนูด้านในและandroid:showAsAction="always"ใช้แทนyour_app_name:showAsAction="always"

เช่น

<item
    android:id="@+id/action_search"
    android:icon="@drawable/icon_search"
    android:title="@string/search"
    your_app_name:showAsAction="ifRoom"/>

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