Bu, pek çok programcının sahip olduğu ve Google'ın henüz tatmin edici, desteklenen bir çözüm sağlamadığı bir sorundur.
Bu konudaki gönderilerde dolaşan çok sayıda çapraz niyet ve yanlış anlama var, bu yüzden lütfen yanıt vermeden önce bu cevabın tamamını okuyun.
Aşağıda, bu sayfadaki diğer yanıtlardan gelen saldırının daha "rafine" ve iyi yorumlanmış bir versiyonunu ekliyorum, ayrıca bu çok yakından ilgili sorulardan gelen fikirleri de dahil ediyorum:
Android menüsünün arka plan rengini değiştirin
Seçenekler menüsünün arka plan rengi nasıl değiştirilir?
Android: uygulamanın menüsünü özelleştirin (örneğin arka plan rengi)
http://www.macadamian.com/blog/post/android_-_theming_the_unthemable/
Android MenuItem Geçiş Düğmesi
Android seçenekleri menüsü arka planını yarı saydam yapmak mümkün müdür?
http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx
Menü arka planını opak olacak şekilde ayarlama
Bu hack'i 2.1 (simülatör), 2.2 (2 gerçek cihaz) ve 2.3 (2 gerçek cihaz) üzerinde test ettim. Henüz test etmek için 3.X tabletim yok, ancak varsa / yaparsam gerekli değişiklikleri burada yayınlayacağım. 3.X tabletlerin, burada açıklandığı gibi Seçenekler Menüleri yerine İşlem Çubukları kullandığı göz önüne alındığında:
http://developer.android.com/guide/topics/ui/menus.html#options-menu
bu hack, 3.X tabletlerde neredeyse kesinlikle hiçbir şey yapmayacaktır (zarar ve yararı yoktur).
SORUNUN AÇIKLAMASI (olumsuz bir yorumla tetikleyici yanıtlamadan önce bunu okuyun):
Seçenekler menüsü, farklı cihazlarda çok farklı stillere sahiptir. Bazılarında beyaz metin bulunan saf siyah, bazılarında siyah metin olan saf beyaz. Ben ve diğer birçok geliştirici, Seçenekler menüsü hücrelerinin arka plan rengini ve Seçenekler menüsü metninin rengini kontrol etmek istiyor .
Bazı uygulama geliştiricilerinin yalnızca hücre arka plan rengini (metin rengini değil) ayarlaması gerekir ve bunu başka bir yanıtta açıklanan android: panelFullBackground stilini kullanarak daha temiz bir şekilde yapabilirler. Bununla birlikte, şu anda Seçenekler menüsünün metin rengini stillerle kontrol etmenin bir yolu yoktur ve bu nedenle, bu yöntem yalnızca arka planı metni "kaybolmayacak" başka bir renge dönüştürmek için kullanılabilir.
Bunu belgelenmiş, geleceğe yönelik bir çözümle yapmayı çok isteriz, ancak Android <= 2.3'ten itibaren mevcut değildir. Bu nedenle, mevcut sürümlerde çalışan ve gelecek sürümlerde çökme / kırılma olasılığını en aza indirmek için tasarlanmış bir çözüm kullanmalıyız. Başarısız olması gerekiyorsa, sorunsuz bir şekilde varsayılan davranışa geri dönen bir çözüm istiyoruz.
Seçenekler menülerinin görünümünü kontrol etmenin gerekmesinin birçok geçerli nedeni vardır (tipik olarak uygulamanın geri kalanı için görsel bir stille eşleştirmek için), bu yüzden bunun üzerinde durmayacağım.
Bununla ilgili yayınlanan bir Google Android hatası var: lütfen bu hataya yıldız ekleyerek desteğinizi ekleyin (Google'ın "ben de" yorumlarından vazgeçtiğini unutmayın: sadece bir yıldız yeterlidir):
http://code.google.com/p/android/issues/detail?id=4441
Şimdiye kadarki ÇÖZÜMLERİN ÖZETİ:
Birkaç poster, LayoutInflater.Factory'yi içeren bir hack önerdi. Önerilen hack Android <= 2.2 için çalıştı ve Android 2.3 için başarısız oldu çünkü hack belgelenmemiş bir varsayım yaptı: aynı LayoutInflater örneğinde LayoutInflater.inflate () çağrısının içinde olmadan LayoutInflater.getView () 'u çağırabilirdi. Android 2.3'teki yeni kod, bu varsayımı bozdu ve NullPointerException'a yol açtı.
Aşağıdaki biraz rafine edilmiş hack'im bu varsayıma dayanmıyor.
Ayrıca, hackler ayrıca dahili, belgelenmemiş bir sınıf adı olan "com.android.internal.view.menu.IconMenuItemView" 'u bir dize olarak (bir Java türü olarak değil) kullanmaya dayanır. Bundan kaçınmanın bir yolunu görmüyorum ve yine de belirtilen hedefi gerçekleştiriyorum. Ancak, mevcut sistemde "com.android.internal.view.menu.IconMenuItemView" görünmüyorsa geri dönecek dikkatli bir şekilde kesmek mümkündür.
Yine, bunun bir hack olduğunu anlayın ve hiçbir şekilde bunun tüm platformlarda çalışacağını iddia etmiyorum. Ancak biz geliştiriciler, her şeyin kitapta olması gereken fantastik bir akademik dünyada yaşamıyoruz: çözmemiz gereken bir sorun var ve onu elimizden geldiğince çözmeliyiz. Örneğin, Seçenekler Menüleri yerine Eylem Çubukları kullandıklarından, "com.android.internal.view.menu.IconMenuItemView" öğesinin 3.X tabletlerde bulunması olası görünmüyor.
Son olarak, bazı geliştiriciler bu sorunu Android Seçenekler Menüsünü tamamen kapatarak ve kendi menü sınıflarını yazarak çözdüler (yukarıdaki bağlantılardan bazılarına bakın). Bunu denemedim, ancak kendi Görünümünüzü yazmak ve Android'in görünümünü nasıl değiştireceğinizi bulmak için zamanınız varsa (eminim burada ayrıntılarda şeytan da vardır), o zaman bu herhangi bir gerektirmeyen güzel bir çözüm olabilir belgelenmemiş hackler.
HİLE:
İşte kod.
Bu kodu kullanmak için onCreate () etkinliğinizden veya onCreateOptionsMenu () etkinliğinizden addOptionsMenuHackerInflaterFactory () 'yi çağırın. Herhangi bir Seçenek Menüsünün daha sonra oluşturulmasını etkileyecek varsayılan bir fabrika ayarlar. Zaten oluşturulmuş Seçenekler Menülerini etkilemez (önceki hackler setMenuBackground () işlev adını kullanıyordu, bu işlev geri dönmeden önce herhangi bir menü özelliğini ayarlamadığından bu çok yanıltıcıdır).
@SuppressWarnings("rawtypes")
static Class IconMenuItemView_class = null;
@SuppressWarnings("rawtypes")
static Constructor IconMenuItemView_constructor = null;
@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;
View view = null;
if (IconMenuItemView_class == null)
{
try
{
IconMenuItemView_class = getClassLoader().loadClass(name);
}
catch (ClassNotFoundException e)
{
return null;
}
}
if (IconMenuItemView_class == null)
return null;
if (IconMenuItemView_constructor == null)
{
try
{
IconMenuItemView_constructor =
IconMenuItemView_class.getConstructor(standard_inflater_constructor_signature);
}
catch (SecurityException e)
{
return null;
}
catch (NoSuchMethodException e)
{
return null;
}
}
if (IconMenuItemView_constructor == null)
return null;
try
{
Object[] args = new Object[] { context, attrs };
view = (View)(IconMenuItemView_constructor.newInstance(args));
}
catch (IllegalArgumentException e)
{
return null;
}
catch (InstantiationException e)
{
return null;
}
catch (IllegalAccessException e)
{
return null;
}
catch (InvocationTargetException e)
{
return null;
}
if (null == view)
return null;
final View v = view;
new Handler().post(new Runnable()
{
public void run()
{
v.setBackgroundColor(Color.BLACK);
try
{
TextView tv = (TextView)v;
tv.setTextColor(Color.WHITE);
}
catch (ClassCastException e)
{
}
}
});
return view;
}
});
}
Okuduğunuz için teşekkürler ve keyfini çıkartın!