Joh*_*his 9 android android-layout android-styles android-5.0-lollipop
我setColorFilter用来设置我的一个按钮的彩色滤镜.这一直在Android 5.0 Lollipop更新之前完美运行.现在,滤色器似乎泄漏到我的其他按钮上,即使我关闭活动并重新打开(如果我关闭应用程序并重新打开它会重置).
我的styles.xml(v21):(与旧的相同,除了它的父级是Material,之前是Holo)
<style name="Theme.FullScreen" parent="@android:style/Theme.Material.Light.NoActionBar.Fullscreen">
<item name="android:buttonStyle">@style/StandardButton</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
Run Code Online (Sandbox Code Playgroud)
我的styles.xml(适用于所有版本):
<style name="StandardButton" parent="android:style/Widget.Button">
<item name="android:background">@android:drawable/btn_default</item>
</style>
Run Code Online (Sandbox Code Playgroud)
我的按钮:
<Button
android:id="@+id/mainMenuButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="mainMenu"
android:text="@string/button_mainMenu"
android:visibility="gone" />
Run Code Online (Sandbox Code Playgroud)
我的代码:
Button mainMenuButton = (Button) findViewById(R.id.mainMenuButton);
mainMenuButton.getBackground().setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.light_green), PorterDuff.Mode.MULTIPLY));
mainMenuButton.setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)
颜色:
<color name="light_green">#5CD65C</color>
Run Code Online (Sandbox Code Playgroud)
结果:
我打开应用程序,然后游戏活动和所有按钮都正确显示.我按下按钮设置滤色器,返回主菜单并重新打开游戏活动,现在所有按钮都是绿色.
有任何想法吗?
Rol*_*f ツ 20
问题是背景Drawable在许多视图中被重用.要确保Drawable不在多个视图之间共享,您应该使用该mutate方法.
见:mutate()
示例代码:
Drawable background = mainMenuButton.getBackground();
background.mutate();
background.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.light_green), PorterDuff.Mode.MULTIPLY));
mainMenuButton.setBackground(background);
Run Code Online (Sandbox Code Playgroud)
在这里。谢谢你的建议。使用以下代码解决了该问题。
设置过滤器
Drawable background = getResources().getDrawable(android.R.drawable.btn_default);
background.setColorFilter(new PorterDuffColorFilter(getResources().getColor(R.color.light_green), PorterDuff.Mode.MULTIPLY));
mainMenuButton.setBackground(background); // Use setBackgroundDrawable for API<16
mainMenuButton.setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)
其他按钮没有变成绿色。
清除过滤器
接下来发生的事情是,Android(部分)似乎忽略了我清除滤色器的调用(这将在代码中稍后发生)。“部分”,因为它是绿色的,但是当我按下它时,它变成黄色(这是 btn_default 行为,而不是带有过滤器的深绿色)。为了解决这个问题,我必须将函数调用顺序更改为以下内容:
mainMenuButton.setVisibility(View.VISIBLE)
mainMenuButton.getBackground().clearColorFilter();
mainMenuButton.invalidate();
Run Code Online (Sandbox Code Playgroud)
注意:然而,这颠倒了按钮的行为。当我按下(并按住)按钮时,它似乎仍然具有绿色滤色镜行为并变成深绿色。当我释放它时,它会按照 btn_default 恢复为灰色。对此有何建议?
我希望这至少能以某种方式帮助其他人解决这个奇怪的问题,对我来说,这个问题只发生在 Android 5.0 Lollipop API 级别 21 上。(我已经测试了 API 8、9、12、13、16、17、18 和 19,其中这个问题没有发生。而且,它似乎不像我预期的那样是 ART 及其 AOT 编译,因为在 Android 4.4.4 设备上启用 ART 不会导致此问题。)奇怪的是,mutate()也没有像我预期的那样工作。
| 归档时间: |
|
| 查看次数: |
2648 次 |
| 最近记录: |