Android işlem çubuğu taşmayı göstermiyor


90

Uygulamamda 3 öğeli bir eylem çubuğum var.

Alan sorunları nedeniyle yalnızca 2 tanesi görüntülenebilir, bu nedenle ilkinin görüntülenmesini ve geri kalanının taşmada görüntülenmesini beklerim. Ancak pratikte yalnızca ilk 2 öğe gösterilir ve herhangi bir taşma algılanamaz.

İşte ilgili kod: 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
Cihazınızda bir menü düğmesi varsa, taşma simgesi gösterilmez. Hangi cihazı kullanıyorsun?
Reinier

1
Test ettiğim sanal cihaz gerçekten bir menü düğmesine sahip, tıkladı ve eksik öğe ortaya çıktı, teşekkürler!
Mats Raemen

2
@Reinier ActionBarSherlock kullanıyorum. 2.3 çalıştıran Galaxy Ace'de gösterilir, 4.0 çalıştıran Galaxy SII'de gösterilmez. Her ikisinde de HW menü düğmesi vardır.
Bay Smith

2
Bunun beni, Galaxy Note II'de değil bir nexus 7 satın alımında taşma simgesine sahip olduğum için şaşırttığını doğrulamak istedim. Notta bir menü düğmesi vardı. Teşekkürler!
bsautner

@Reinier lütfen aynı sorunla karşılaşmama yardım edin, ne yapmalıyım?
rupesh

Yanıtlar:


125

Cihaz menü düğmesinden bağımsız olarak üç noktayı göstermek istiyorsanız! daha sonra bu yöntemi uygulama sınıfınızda 'onCreate yöntemi- çağırabilirsiniz.

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
Bu, platformdaki uygulamaların geri kalanıyla tutarlılığı bozan korkunç bir hack. Bunu yapma.
adamp

19
Bu, iki kötülükten daha az gibi görünüyor. Mevcut davranış kabul edilemez.
biorbnA

6
Bu, taşmaya izin vermenin harika bir yolu, menü sabit tuşu artık tolere edilmemelidir.
Necronet

5
Harika çalışıyor! Kullanıcı donanım menüsü düğmesine bastığında bile çalışır (bu harika), yine de menü ses efektini iki kez duyacaksınız .. kimse sadece bir kez nasıl ses çıkaracağını biliyor mu?
Bruce

5
BU BİR HACK DEĞİLDİR. Android'de 2 + 2 olmadığı için, geliştiricilerin hack'lere ne diyeceğini bilmesi gerekiyor. Yansıma, Java mekanizmalarını kullanarak zamandan tasarruf etmektir, yoksa bağlamları iç sınıflarınıza 24/7 geçirirsiniz veya AOSP'yi sonsuza özelleştirirsiniz. Bana göre bu çözüm, yalnızca sadıkların temiz olarak gördükleri şeyler uğruna, tonlarca AOSP özel içeriğini VE bağlantılı, özel ilişkileri geçersiz kılmak ve dahil etmek zorunda kalma sorununu çözüyor. Küçük listeler için FASTSCROLL'u sürekli olarak etkinleştirmeye zorlayamayacağınızı biliyor muydunuz? Yansımayı kullanmadan önce, bu, TEK karakterli bir düzenleme için 10'dan fazla AOSP kaynağını kopyalamamı gerektirdi.
leRobot

53

Eylem Çubuğu

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

}

Eylem Çubuğu Simge Kümesini İndirin


2
@Reinier yorumuna bir göz atın, bu doğru "Cihazınızda bir menü düğmesi varsa, taşma simgesi görünmez".
Ahmad Dwaik 'Warlock'

Menü düğmesi olan cihazda test ediyorum ve benim durumumda taşma görünüyor. Daha android:showAsAction="always"fazla öğe için kullanıyorum
Kirit Vaghela

hangi cihazda test ettiniz? Bir neo v xperia ve s # kullandım
Ahmad Dwaik 'Warlock'

1
Not: Taşma menünüzü şişiren öğeniz MUTLAKA gösterilmelidirAsAction = "her zaman"
Kirit Vaghela

1
showAsAction, eski SDK'larda android ad alanında kullanılamaz. Bunun üstesinden gelmek için developer.android.com/training/basics/actionbar/… bağlantısını takip edin . Bu NS schemas.android.com/apk/res-auto ekledikten sonra , yukarıdaki numara benim için mükemmel bir şekilde çalıştı
chedine

42

Bunun bir taşma menüsü olmadığını anlıyorum, ancak benzer. Tamam, bu basit ama anlaşılması zordu.

Öncelikle taşma şişiricisi olarak kullanmak istediğiniz bir menü öğesine ihtiyacınız var. Misal

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

Öğenizi aldıktan sonra, taşma menüsünde istediğiniz öğelerinizi içeren bir alt menü ekleyin. Misal:

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

Tıklandığında bu, içindeki diğer öğeleri şişirecektir. Uygulamam ActionBarSherlock 4.0 kullanıyor, bu yüzden bu sizin için çalışmadan önce "SplitActionBar" a erişmeniz gerekecek. (Hala varsayılan android Eylem Çubuğu'nda çalışacak)

Bunu nasıl yapacağınız aşağıda açıklanmıştır: AndroidManifest.xml dosyanızda, bu kodu, içinde taşma menüsüne ihtiyaç duyduğunuz etkinliğin altına eklemeniz gerekir.

android:uiOptions="splitActionBarWhenNarrow"

NOT: Taşma menünüzü şişiren öğeniz ZORUNLUshowAsAction="always"

Vwola! bir taşma menünüz var! Umarım sana yardım etmişimdir. :)


3
Güzel bir çözüm, menü düğmesi kesmesinden daha iyi.
ol0

26

Donanım menüsü düğmeleri olan cihazlarda (Galaxy S3, Samsung gibi inatçı ...) taşma menüsü, donanım menüsü düğmesi kullanılarak 'geleneksel' menü gibi davranır.


2
Eski cevap, ancak uyumluluk kitaplığıyla çok garip sonuçlarla karşılaşıyor: Donanım düğmeli 3 cihaz, Not 3 Neo = Taşma menüsü gösteriliyor, menü düğmesi çalışmıyor, Not 1 = Taşma yok, menü düğmesi çalışıyor, Galaxy S3, hayır taşma, menü düğmesi çalışmıyor! Bu çılgınca.
3c71

5

"Taşma" menüsü dediğinizde, sonunda daha fazla öğe olduğunu belirtmek için görünen üç noktayı mı kastediyorsunuz .... yoksa altta taşma öğeleri için gösterilen bölünmüş eylem çubuğunu mu kastediyorsunuz?

Bölünmüş eylem çubuğunu kastediyorsanız, bunu etkinliğinizin bildirim dosyasına eklemelisiniz.

android:uiOptions="splitActionBarWhenNarrow"

Varsayılan olarak, üç nokta taşma menüsü otomatik olarak gerçekleşmelidir, bu nedenle sorunun ne olduğunu yukarıda verdiğiniz bilgilerden anlamak zordur.


Üç noktayı kastediyorum. Öğeler yüzünden değil, çünkü siparişteki öğeleri her değiştirirken, gösterilen ilk 2 simge
Mats Raemen

Asıl sorunu belirleyebilmek için ekstra bilgi sağlamalı mıyım?
Mats Raemen

MinSdkVersion, targetSdkVersion ve üzerinde test ettiğiniz sürüm nedir?
Sparky

5
Cihazınızın menü için fiziksel düğmeleri var mı yoksa bunlar galaxy nexus telefonu gibi sanal düğmeler mi? Üç noktanın yalnızca telefonunuzun fiziksel düğmeleri yoksa görüneceğini düşünüyorum.
wnafee

5

Actionbarcompat üzerinde her zaman eylem taşmasını (üç nokta) göstermek için:
menü dosyasında, örnek:
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>

ve etkinlik dosyasında:

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

Benim için iyi çalıştı.
Google Nexus S, Samsung S3 üzerinde test edilmiştir.


3

Menü düğmesi olan cihazlarda, taşma menüsünün ActionBar'da gösterilmediği anlaşılıyor. Ayrıca, bir cihazın API seviyesi 14'ten (4.0+) önce bir donanım menüsü düğmesine sahip olup olmadığını bilmemizin bir yolu yoktur .

Bu çözüm android.support.v7.app.ActionBar, yalnızca Petek öncesi (<3.0) standart seçenekler menüsünü açan, aksi takdirde sisteme bırakan bir taşma düğmesi ekler . Her durumda , tüm eylemler arasında alwaysveya ifRoomiçin seçim yapabilirsiniz .

İşlem Çubuğu Simge Paketinden taşma simgesini alın .

Bir menü ekle (ilgisiz bazı bölümleri başlık, sıralama vb. Olarak kabul ediyorum)

<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+ üzerinde taşma eylemimizi kaldırın

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

Sonunda Activity.openOptionsMenu()taşma eyleminden çağrı .

Şey ... hayır. openOptionsMenu()Bir menü düğmesinden arama yapamazsınız ... ancak Android Ek notları kullanıyorsanız işiniz kolayca yapılır:

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

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

Değilse böyle bir şey yapmalısın, sanırım

@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

Uygulamanın temasını Theme.AppCompat.Light.DarkActionBar'dan Theme.AppCompat.Light'a değiştirmeyi deneyin.


2

Put xmlns:your_app_name="http://schemas.android.com/apk/res-auto"yerine menü etiketi ve iç android:showAsAction="always"kullanımyour_app_name:showAsAction="always"

örneğin

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.