Bilah tindakan Android tidak menunjukkan luapan

90

Saya memiliki bilah tindakan di aplikasi saya dengan 3 item.

Hanya 2 yang dapat ditampilkan karena masalah ruang, jadi saya berharap yang pertama ditampilkan dan sisanya ditampilkan dalam luapan. Namun dalam praktiknya, hanya 2 item pertama yang ditampilkan dan tidak ada luapan yang terdeteksi.

Berikut adalah kode yang relevan: 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;
}
Mats Raemen
sumber
120
Jika perangkat Anda memiliki tombol menu, ikon luapan tidak akan ditampilkan. Anda menggunakan perangkat apa?
Reinier
1
perangkat virtual yang saya uji memiliki tombol menu, diklik dan item yang hilang muncul, terima kasih!
Mats Raemen
2
@Reinier Saya menggunakan ActionBarSherlock. Pada Galaxy Ace yang menjalankan 2.3 ditampilkan, pada Galaxy SII yang menjalankan 4.0 tidak ditampilkan. Keduanya memiliki tombol menu HW.
Mister Smith
2
Saya ingin mengonfirmasi bahwa ini membuat saya bingung bahwa saya memiliki ikon overflow pada pembelian nexus 7 bukan pada Galaxy Note II. Catatan memiliki tombol menu. Terima kasih!
bsautner
@Reinier tolong bantu saya menghadapi masalah yang sama apa yang harus saya lakukan?
rupesh

Jawaban:

125

Jika Anda ingin menampilkan tiga titik, terlepas dari tombol menu perangkat! maka Anda dapat memanggil metode ini di kelas aplikasi Anda 'metode onCreate-

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());
    }
}
Atul Kaushik
sumber
32
Ini adalah peretasan hebat yang merusak konsistensi dengan aplikasi lain di platform. Jangan lakukan ini.
adamp
19
Ini sepertinya lebih kecil dari dua kejahatan. Perilaku saat ini tidak bisa diterima.
biorbnA
6
Ini cara yang bagus untuk membiarkan overflow, menu hard key seharusnya tidak lagi ditoleransi.
Necronet
5
Ini bekerja dengan baik! Berfungsi meskipun pengguna menekan tombol menu perangkat keras (yang brilian), meskipun Anda akan mendengar efek suara menu dua kali .. adakah yang tahu cara membuatnya hanya bersuara sekali?
Bruce
5
INI BUKAN HACK. Pengembang perlu tahu apa yang disebut peretasan karena ini bukan 2 + 2 di Android. Refleksi menghemat waktu menggunakan mekanisme Java, atau Anda akan meneruskan konteks ke kelas batin Anda 24/7, atau menyesuaikan AOSP hingga tak terbatas. Bagi saya, solusi ini memecahkan masalah karena harus mengganti dan menyertakan banyak konten kustom AOSP DAN terkait, asosiasi pribadi hanya demi apa yang dianggap bersih oleh para puritan. Tahukah Anda bahwa Anda tidak dapat memaksa FASTSCROLL diaktifkan secara konsisten untuk daftar kecil? Sebelum saya menggunakan refleksi, ini mengharuskan saya untuk menyalin 10+ sumber AOSP, untuk edit SATU karakter.
leRobot
53

Bilah Tindakan

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);
    }

}

Unduh Kumpulan Ikon Bilah Tindakan

Kirit Vaghela
sumber
2
Lihat komentar @Reinier, memang benar "Jika perangkat Anda memiliki tombol menu, ikon luapan tidak akan muncul".
Ahmad Dwaik 'Warlock'
Saya menguji di perangkat yang memiliki tombol menu dan luapan ditampilkan dalam kasus saya. Saya menggunakan android:showAsAction="always"untuk lebih banyak item
Kirit Vaghela
di perangkat apa kamu sudah mengujinya? Saya telah menggunakan neo v xperia dan s #
Ahmad Dwaik 'Warlock'
1
Catatan: Item Anda yang meningkatkan menu tambahan Anda HARUS showAsAction = "selalu"
Kirit Vaghela
1
showAsAction tidak tersedia di namespace android di SDK lama. Ikuti tautan ini developer.android.com/training/basics/actionbar/… untuk mengatasi hal ini. Setelah menambahkan skema NS ini.android.com/apk/res-auto , trik di atas bekerja dengan baik untuk saya
chedine
42

Saya menyadari ini bukan menu luapan, tetapi serupa. Oke, ini sederhana tapi sulit untuk diketahui.

Pertama-tama Anda memerlukan item menu yang ingin Anda gunakan sebagai inflater luapan. Contoh

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

Setelah Anda memiliki item Anda, tambahkan sub-menu yang berisi item Anda yang Anda inginkan di menu tambahan. Contoh:

<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>

Saat diklik, ini akan meningkatkan item lain di dalamnya. Aplikasi saya menggunakan ActionBarSherlock 4.0 jadi sebelum ini bekerja untuk Anda, Anda perlu mengakses "SplitActionBar". (Masih akan berfungsi di Actionbar android default)

Begini caranya: Dalam file AndroidManifest.xml, Anda perlu menambahkan kode ini di bawah aktivitas yang Anda perlukan untuk menu tambahan.

android:uiOptions="splitActionBarWhenNarrow"

CATATAN: Item Anda yang meningkatkan menu tambahan Anda HARUSshowAsAction="always"

Vwola! Anda memiliki menu tambahan! Semoga saya membantu Anda. :)

LeviRockerSk8er
sumber
3
Solusi bagus, lebih baik daripada hack tombol menu.
ol0
26

Pada perangkat dengan tombol menu perangkat keras (Galaxy S3, keras kepala seperti Samsung ...) menu tambahan berfungsi sebagai menu 'tradisional', dengan menggunakan tombol menu perangkat keras.

Lukas Batteau
sumber
2
Jawaban lama, namun dengan pustaka kompatibilitas hanya menemukan hasil yang sangat aneh: 3 perangkat dengan tombol perangkat keras, Catatan 3 Neo = Menu luapan ditampilkan, tombol menu tidak berfungsi, Catatan 1 = Tidak ada luapan, tombol menu berfungsi, Galaxy S3, tidak overflow, tombol menu tidak berfungsi! Ini gila.
3c71
5

Saat Anda mengatakan menu "luapan", apakah yang Anda maksud dengan tiga titik yang muncul di akhir untuk menunjukkan bahwa ada lebih banyak item .... atau maksud Anda bilah tindakan terpisah yang muncul di bagian bawah untuk item luapan?

Jika yang Anda maksud adalah bilah tindakan terpisah, Anda harus menambahkan ini ke file manifes aktivitas Anda

android:uiOptions="splitActionBarWhenNarrow"

Secara default, menu luapan tiga titik akan terjadi secara otomatis, jadi sulit untuk mengetahui apa masalahnya dari informasi yang Anda berikan di atas.

wnafee.dll
sumber
Maksud saya tiga titik. Ini tidak seperti itu karena itemnya, karena setiap kali mengubah item pesanan, itu adalah 2 ikon pertama yang ditampilkan
Mats Raemen
haruskah saya memberikan informasi tambahan untuk dapat menentukan masalah yang sebenarnya?
Mats Raemen
Apa minSdkVersion, targetSdkVersion, dan versi yang Anda uji?
Sparky
5
Apakah perangkat Anda memiliki tombol fisik untuk menu atau tombol virtual seperti ponsel galaxy nexus? Saya pikir tiga titik hanya akan muncul jika ponsel Anda tidak memiliki tombol fisik.
wnafee
5

Untuk selalu menampilkan action overflow (tiga titik) pada actionbarcompat:
di file menu, contoh:
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>

dan di file aktivitas:

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

Ini bekerja dengan baik untuk saya.
Diuji di Google Nexus S, Samsung S3.

TuanSiro
sumber
3

Tampaknya pada perangkat dengan tombol menu, menu tambahan tidak ditampilkan di ActionBar. Kami juga tidak memiliki cara untuk mengetahui apakah perangkat memiliki tombol menu perangkat keras sebelum API level 14 (4.0+).

Solusi ini menambahkan tombol luapan ke a android.support.v7.app.ActionBaryang membuka menu opsi standar hanya pada pra-Honeycomb (<3.0), jika tidak, serahkan ke sistem. Bagaimanapun Anda dapat memilih antara alwaysatau ifRoomuntuk semua tindakan.

Dapatkan ikon luapan dari Paket Ikon Bilah Tindakan .

Tambahkan menu (Saya memasukkan beberapa bagian yang tidak relevan seperti judul, memesan, dll.)

<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>

Hapus tindakan overflow kami di 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);
}

Akhirnya panggilan Activity.openOptionsMenu()dari tindakan luapan.

Er ... tidak. Anda tidak dapat tidak memanggil openOptionsMenu()dari tombol menu ... tetapi jika Anda menggunakan AndroidAnnotations Anda selesai dengan mudah:

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

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

Jika tidak, Anda harus melakukan hal seperti ini, saya kira

@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();
        }
    }
    );
}
IlDan
sumber
2

Coba ubah tema aplikasi dari Theme.AppCompat.Light.DarkActionBar menjadi Theme.AppCompat.Light

Sagar Devanga
sumber
2

Letakkan xmlns:your_app_name="http://schemas.android.com/apk/res-auto"di dalam tag menu dan sebagai gantinya android:showAsAction="always"gunakanyour_app_name:showAsAction="always"

untuk mis

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

Rashmi Jain
sumber