SORU
31 Mayıs 2010, PAZARTESİ


Arka plan seçenekleri menüsünün rengini değiştirmek

Beyaz olan seçenekler menüsü için varsayılan rengi değiştirmek için çalışıyorum. Seçenekler menüsünde her madde için siyah bir arka plan istiyorum. Android:itemBackground="#000000" öğesi menü öğesi içinde ama çalışmıyor.bazı sürgünler denedim Eğer bu mümkün olup olmadığını bilmiyorum. Herhangi bir fikir hoş geldiniz! :)

CEVAP
12 Aralık 2011, PAZARTESİ


Bu açıkça programcılar bir sürü var ve Google henüz tatmin edici, desteklenen bir çözüm sağlamak için bir sorundur.

Geçti niyetli ve yanlış anlaşılmalar bu konu hakkında mesajlar etrafında yüzen bir yeri vardır, lütfen yanıt vermeden önce bütün bu cevabı okuyun.

Bir daha "" ve yorumladı sürümü bu sayfadaki diğer cevaplara göre hack olan da bu fikirler çok yakından birleşmeyle ilgili sorular: . rafine vardır aşağıda

Change background color of android menu

Change the background color of the options menu

Android: customize application's menu (e.g background color)

http://www.macadamian.com/blog/post/android_-_theming_the_unthemable/

Android MenuItem Toggle Button

Is is possible to make the Android options menu background non-translucent?

http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx

Setting the menu background to be opaque

Bu 2.1 (simülatör), 2.2 (2 gerçek cihazlar), 2.3 (2 gerçek cihazlar) hack test ettim. Herhangi bir 3 yok.Test için X tabletler henüz ama burada eğer yaparsam ne zaman gerekli değişiklikleri yayınlayacağız. 3 verilmiş.X tablet burada açıklandığı gibi Eylem Barlar yerine Seçenek Menüleri kullanın:

http://developer.android.com/guide/topics/ui/menus.html#options-menu

bu kesmek neredeyse kesinlikle 3 şey (hiçbir zarar ve hiçbir iyi yapar.X tablet.

SORUN (tetik-cevap olumsuz bir yorum daha önce bunu okuyun) AÇIKLAMA:

Seçenekler menüsü farklı cihazlarda çok farklı stilleri vardır. Beyaz metin ile saf siyah, siyah metin ile Saf beyaz. Ben ve pek çok diğer gelişmiş Seçenekler menü hücrelerin arka plan rengini kontrol etmekgibi Seçenekler menü metin rengi.

Bazı uygulama geliştiriciler sadece hücre arka plan rengini ayarlamak gerekiyor (metin rengi) ve temiz bir şekilde android kullanarak bunu yapabilirler:panelFullBackground tarzı bir cevap olarak nitelendirdi. Ancak, şu anda hiçbir şekilde kontrol Seçenekleri menüsü metin rengi ile stilleri, ve bu yüzden bir tek bu yöntemi kullanın değiştirmek için arka plan için bir renk yapmazlar metni "yok."

, Geleceğe yönelik belgelenmiş bir çözüm ile bunu yapmak isterdik, ama biri sadece Android < mevcut değildir;= 2.3. Güncel sürümleri çalışır ve gelecek sürümlerde/kırma çökmesini şansını en aza indirmek için tasarlanmış bir çözüm kullanmak zorundayız. Eğer başarısız varsa incelikle varsayılan davranışa geri başarısız bir çözüm istiyoruz.

Biri üzerinde durmak da yok, o yüzden Seçenekleri menüler genellikle app geri kalanı için bir görsel stil maç için () görünümünü kontrol etmek gerekir neden birçok meşru nedenleri vardır.

Google Android bir hata, bu konuda yayınlanan var: lütfen (not Google "ben de" Yorum: bir yıldız yeterli): . etmemektedir bu bug oyuncular tarafından destek Ekle

http://code.google.com/p/android/issues/detail?id=4441

ÇÖZÜMLERİ ŞİMDİYE KADAR: ÖZET

Çeşitli posterler bir Layoutİnflater ilgili hack ettiler.Fabrika. Önerilen Android < için çalıştı hack;= 2.2 ve belgesiz bir varsayım yapılmış hack çünkü Android 2.3 için başarısız oldu: o bir Layoutİnflater arayabilir.() getView doğrudan şu anda Layoutİnflater çağrısı içinde olmadan.() şişirmek aynı Layoutİnflater örneği. Android 2.3 yeni kod bu varsayım kırdı ve bir NullPointerException yol açtı.

Biraz rafine benim hack aşağıda bu varsayıma dayanmaz.

Ayrıca, gardiyanlar da iç, belgesiz sınıf adı "com.kullanarak güveniyor android.iç.görünüm.menü."Bir dize (Java türü olarak değil). İconMenuİtemView Bunu önlemek ve hala belirtilen hedefe ulaşmak için herhangi bir yol göremiyorum. Ancak, olası bir "com.eğer geri düşecek dikkatli bir şekilde hack yapmak çok önemlidir android.iç.görünüm.menü.İconMenuİtemView" mevcut sistemde görünmüyor.

Yine, bu ve hiçbir şekilde duyuyorum bu bütün platformlarda çalışacağını iddia eden bir hack olduğunu anlıyoruz. Çözmemiz gereken bir sorunumuz var ve bunu en iyi şekilde çözmek için biz yapabiliriz. ama biz geliştiriciler, her şeyi kitabına göre olması gereken akademik bir fantezi dünyasında yaşıyor: Örneğin, "com.bu zor görünüyor android.iç.görünüm.menü.İconMenuİtemView" 3 üzerinde var olacaktır.X Eylem kullanımı beri tablet Seçenekleri Menüler yerine Çubuklar.

Son olarak, bazı geliştiriciler tamamen Android Seçenekler Menüsünü bastırmak ve kendi menüsünü sınıf (yukarıda bazı bağlantılar) yazarak bu sorunu çözmüş. Denemedim bu, ama yazmak için zaman kendi Görünüm ve biçim dışarı nasıl yerine Android görünümü (eminim şeytanın detayları burada) öyleyse bu iyi bir çözüm değil gerektiren herhangi bir belgesiz kesmek.

KESMEK:

İşte kod.

Bu kodu kullanmak için addOptionsMenuHackerİnflaterFactory arama() bir KEZ aktivite onCreate() veya etkinlik onCreateOptionsMenu(). Herhangi bir Seçenek Menüsü sonraki oluşturulmasını etkileyecek Varsayılan fabrika ayarlar. Bunu etkilemez Seçenekleri Menüleri, zaten oluşturulan (önceki kesmek kullanılan bir işlev adı setMenuBackground(), çok yanıltıcı beri çalışmıyor set menü özellikleri daha önce döner).

@SuppressWarnings("rawtypes")
static Class       IconMenuItemView_class = null;
@SuppressWarnings("rawtypes")
static Constructor IconMenuItemView_constructor = null;

// standard signature of constructor expected by inflater of all View classes
@SuppressWarnings("rawtypes")
private static final Class[] standard_inflater_constructor_signature = 
new Class[] { Context.class, AttributeSet.class };

protected void addOptionsMenuHackerInflaterFactory()
{
    final LayoutInflater infl = getLayoutInflater();

    infl.setFactory(new Factory()
    {
        public View onCreateView(final String name, 
                                 final Context context,
                                 final AttributeSet attrs)
        {
            if (!name.equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView"))
                return null; // use normal inflater

            View view = null;

            // "com.android.internal.view.menu.IconMenuItemView" 
            // - is the name of an internal Java class 
            //   - that exists in Android <= 3.2 and possibly beyond
            //   - that may or may not exist in other Android revs
            // - is the class whose instance we want to modify to set background etc.
            // - is the class we want to instantiate with the standard constructor:
            //     IconMenuItemView(context, attrs)
            // - this is what the LayoutInflater does if we return null
            // - unfortunately we cannot just call:
            //     infl.createView(name, null, attrs);
            //   here because on Android 3.2 (and possibly later):
            //   1. createView() can only be called inside inflate(),
            //      because inflate() sets the context parameter ultimately
            //      passed to the IconMenuItemView constructor's first arg,
            //      storing it in a LayoutInflater instance variable.
            //   2. we are inside inflate(),
            //   3. BUT from a different instance of LayoutInflater (not infl)
            //   4. there is no way to get access to the actual instance being used
            // - so we must do what createView() would have done for us
            //
            if (IconMenuItemView_class == null)
            {
                try
                {
                    IconMenuItemView_class = getClassLoader().loadClass(name);
                }
                catch (ClassNotFoundException e)
                {
                    // this OS does not have IconMenuItemView - fail gracefully
                    return null; // hack failed: use normal inflater
                }
            }
            if (IconMenuItemView_class == null)
                return null; // hack failed: use normal inflater

            if (IconMenuItemView_constructor == null)
            {
                try
                {
                    IconMenuItemView_constructor = 
                    IconMenuItemView_class.getConstructor(standard_inflater_constructor_signature);
                }
                catch (SecurityException e)
                {
                    return null; // hack failed: use normal inflater
                }
                catch (NoSuchMethodException e)
                {
                    return null; // hack failed: use normal inflater
                }
            }
            if (IconMenuItemView_constructor == null)
                return null; // hack failed: use normal inflater

            try
            {
                Object[] args = new Object[] { context, attrs };
                view = (View)(IconMenuItemView_constructor.newInstance(args));
            }
            catch (IllegalArgumentException e)
            {
                return null; // hack failed: use normal inflater
            }
            catch (InstantiationException e)
            {
                return null; // hack failed: use normal inflater
            }
            catch (IllegalAccessException e)
            {
                return null; // hack failed: use normal inflater
            }
            catch (InvocationTargetException e)
            {
                return null; // hack failed: use normal inflater
            }
            if (null == view) // in theory handled above, but be safe... 
                return null; // hack failed: use normal inflater


            // apply our own View settings after we get back to runloop
            // - android will overwrite almost any setting we make now
            final View v = view;
            new Handler().post(new Runnable()
            {
                public void run()
                {
                    v.setBackgroundColor(Color.BLACK);

                    try
                    {
                        // in Android <= 3.2, IconMenuItemView implemented with TextView
                        // guard against possible future change in implementation
                        TextView tv = (TextView)v;
                        tv.setTextColor(Color.WHITE);
                    }
                    catch (ClassCastException e)
                    {
                        // hack failed: do not set TextView attributes
                    }
                }
            });

            return view;
        }
    });
}

Okuduğunuz için teşekkür ederim ve keyfini çıkarın!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • monkophile

    monkophile

    25 Temmuz 2007
  • TheOtherMau5

    TheOtherMau5

    6 Mart 2012
  • Tire Rack

    Tire Rack

    31 Mayıs 2007