使用深色背景时棒棒糖弹出菜单上的文物

时间:2015-04-13 23:36:53

标签: android android-5.0-lollipop

正如您所看到的,背景在弹出窗口后面扭曲了。它只发生在棒棒糖上!请不要被我的样式文件中的所有x_弄糊涂。我刚刚对代码进行了去标记。

With dark background on popup

在主题文件中:

 <style name="core" parent="Theme.AppCompat.Light">

    <!-- Popup menu -->
    <item name="android:popupMenuStyle">@style/x_popup_menu_theme</item>
    <item name="android:textAppearanceSmallPopupMenu">@style/x_popup_menu_small_text</item>
    <item name="android:textAppearanceLargePopupMenu">@style/x_popup_menu_large_text</item>

</style>

在v21 / themes_styles.xml

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

<style name="x_popup_menu_large_text" parent="TextAppearance.AppCompat.Widget.PopupMenu.Large">
    <item name="android:textColor">@color/std_white</item>
</style>

<style name="x_popup_menu_small_text" parent="TextAppearance.AppCompat.Widget.PopupMenu.Small">
    <item name="android:textColor">@color/std_white</item>
</style>

如果我将样式更改/删除,则其工作方式如下图所示。

With light background on popup

<style name="x_popup_menu_theme" parent="Widget.AppCompat.PopupMenu">
</style>

<style name="x_popup_menu_large_text" parent="TextAppearance.AppCompat.Widget.PopupMenu.Large">
</style>

<style name="x_popup_menu_small_text" parent="TextAppearance.AppCompat.Widget.PopupMenu.Small">
</style>

2 个答案:

答案 0 :(得分:7)

Android 5.0.x中有一个错误(已在5.1中修复),在高架窗口中设置不透明(例如@color)背景会导致视觉瑕疵。

作为5.0.x设备的变通方法,您可以将背景设置为非不透明的可绘制对象,例如圆角矩形。

RES /抽拉/ my_popup_bg.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <corners android:radius="2dp" />
    <solid android:color="@color/x_navy_dark" />
</shape>

RES /值/ styles.xml:

...

<style name="x_popup_menu_theme" parent="Widget.AppCompat.PopupMenu">
    <item name="android:popupBackground">@drawable/my_popup_bg</item>
</style>

答案 1 :(得分:-1)

[编辑 - 删除了建议关闭硬件加速的原始答案]

看来这是带有帧缓冲区的android 5.0中的一个错误。它已在Android 5.1中修复。 Bug listing

以下是Chet Haase关于如何解决这个问题的消息:

  

触发器是您将弹出窗口的背景设置为颜色,该颜色解析为彩色矩形。您应该使用圆角矩形(如默认样式使用),或者更好的是,使用深色主题而不是自定义颜色。   错误[在android中]([在5.1中修复])是我们没有考虑阴影的填充,并且在这种情况下没有在窗口中设置正确的半透明标志。

现在我只是使用linearlayout创建了自己的弹出菜单,并手动处理了点击和后退按钮。不是太优雅,但它与艺术团队想要的比弹出菜单更接近。

My finished popup

           <LinearLayout
                android:id="@id/fake_popup"
                android:layout_below="@id/pending"
                android:visibility="gone"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" android:orientation="vertical">
                <TextView
                    style="@style/button.dropdown"
                    android:id="@id/send_reminder"
                    android:background="@color/navy_dark"
                    android:textColor="@color/std_white"
                    android:text="@string/send_reminder"/>
                <TextView
                    style="@style/button.dropdown"
                    android:id="@id/withdraw_invite"
                    android:background="@color/navy_dark"
                    android:textColor="@color/std_white"
                    android:text="@string/withdraw_invite"/>

            </LinearLayout>

处理点击以显示/隐藏菜单(注意注释是ButterKnife):

    @OnClick (R.id.pending) public void showPendingActionsMenu () {
    // pendingActionsPopupMenu.show ();

    if (pendingPopup.isShown ()) {
        hidePendingPopup ();
    } else {
        showPendingPopup ();
    }
}

并处理各个选项的点击次数:

@OnClick (R.id.send_reminder)
public void sendReminder () { //your code here }

不要忘记覆盖onBackPressed!

@Override public void onBackPressed () {
    if (pendingPopup.isShown ()) {
        hidePendingPopup ();
    } else {
        super.onBackPressed ();
    }
}