2016-09-02 5 views
5

Я пытаюсь применить стиль к всплывающему меню Android. Меню отображается при нажатии кнопки. В моем примере я хочу установить черный фон меню.Изменение стиля всплывающего меню - не работает

Итак, мой макет меню:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:title="Item 1" 
     android:id="@+id/menu1"> 
    </item> 

    <item 
     android:title="Item 2" 
     android:id="@+id/menu2"> 
    </item> 

</menu> 

Следующая моя деятельность раскладка:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.michal.popupmenu.MainActivity"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello World!"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New Button" 
     android:id="@+id/button" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:onClick="btnClick" 
     android:nestedScrollingEnabled="true"/> 
</RelativeLayout> 

Код для отображения меню на кнопку мыши:

public class MainActivity extends AppCompatActivity 
{ 

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

    public void btnClick(View view) 
    { 
     showMenu(view); 

    } 


    public void showMenu(View v) 
    { 
     PopupMenu popup = new PopupMenu(this, v); 
     popup.inflate(R.menu.popup_menu); 
     popup.show(); 
    } 
} 

Стили xmle был автоматически , Я только добавил стиль меню, чтобы установить черный фон меню, здесь:

<style name="PopupMenu" parent="Widget.AppCompat.PopupMenu"> 
    <item name="android:popupBackground">@android:color/black</item> 

</style> 

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
    <item name="popupMenuStyle">@style/PopupMenu</item> 
</style> 

Но все меню фон белый, и он должен быть черным. Какие-нибудь идеи, что не так?

[править] Согласно комментариям, обновленный код:

<resources> 

    <style name="PopupMenu" parent="@style/Widget.AppCompat.Light.PopupMenu"> 
     <item name="android:popupBackground">#FF4081</item> 
    </style> 

    <!-- Base application theme. --> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <!-- Customize your theme here. --> 
     <item name="colorPrimary">@color/colorPrimary</item> 
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
     <item name="colorAccent">@color/colorAccent</item> 
    </style> 



</resources> 

Основная деятельность:

public void showMenu(View v) 
    { 
     Context wrapper = new ContextThemeWrapper(getApplicationContext(), R.style.PopupMenu); 
     PopupMenu popup = new PopupMenu(wrapper, v); 

     // This activity implements OnMenuItemClickListener 
     //popup.setOnMenuItemClickListener((PopupMenu.OnMenuItemClickListener) this); 
     popup.inflate(R.menu.popup_menu); 
     popup.show(); 
    } 

Результат не то, что я ожидал

result

Меню фон все еще черный, не цвет, который я хочу устанавливать.

ответ

5

Я также попробовал решение было упомянуто выше, но мой PopupMenu цвет не изменился, так что я в конечном итоге делаю следующим образом:

1.Created пользовательской вытяжки с требуемым цветом следующим образом:

popup_color_drawable.xml

<?xml version="1.0" encoding="utf-8"?> 
    <selector 
     xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
    <color 
     android:color="@color/colorPrimary"/> 
     </item> 
     <item> 
      <color 
       android:color="#655611"/> 
     </item> 
    </selector> 

Добавлено state_pressed получить выбор эффекта

2 мою styles.xml, добавил следующий код:

<style name="MyPopupMenu" parent="Widget.AppCompat.PopupMenu"> 
    <item name="android:itemBackground">@drawable/popup_color_drawable</item> 
</style> 

Я использую Theme.AppCompat.Light.DarkActionBar в моей базовую тему для приложения.

3.Then в моей деятельности

public void showpopup(View view){ 
    Context wrapper = new ContextThemeWrapper(this, R.style.MyPopupMenu); 
    PopupMenu popup = new PopupMenu(wrapper, view); 
    popup.inflate(R.menu.popup_menu); 
    popup.show(); 
} 

После результат я получил, используя этот код enter image description here

Hopes это поможет вам.

+0

Как сменить текст и цвет текста с помощью этой души? Если я задаю цвет прозрачным, я получаю текстовый фон не прозрачным. – user1209216

+0

вы можете изменить цвет текста, указав ' # ff0000' in ** MyPopupMenu ** –

+0

Он работает ... однако он выглядит плохо при выборе пункта меню (нажатием и удержанием на нем), потому что цвет элемента меню изменяется, а текст фона - нет. Есть ли для этого решение? – user1209216

4

вы должны попробовать это:

public void showMenu(View v) 
    { 
     Context wrapper = new ContextThemeWrapper(getContext(), R.style.PopupMenu); 
     PopupMenu popup = new PopupMenu(wrapper, v); 
     popup.inflate(R.menu.popup_menu); 
     popup.show(); 
    } 
+1

В моем случае, getApplicationContext(), и она работает. Почему я не могу объявить стиль непосредственно в xml? – user1209216

+0

bcz его завышенный вид .. вы не можете объявить стиль завышенному виду. а также его XML-файл меню. я пробовал так много времени, и я провалился .. так что я сделал это, и его работа. –

+0

Одно редактирование ... это не работает. Теперь фон меню всегда черный, а текст всегда белый. Не установлены значения. – user1209216

2

В первоначальном вопросе все вам нужно сделать, это изменить:

<item name="android:popupBackground">#FF4081</item> 

к:

<item name="android:itemBackground">@android:color/white</item>