android 可绘制选择器兼容性问题
android drawable selector compatibility issue
我有一个带有可绘制选择器的按钮设置为背景。
button_sign_in_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_sign_in_background_selected" android:state_focused="true" />
<item android:drawable="@drawable/button_sign_in_background_selected" android:state_pressed="true" />
<item android:drawable="@drawable/button_sign_in_background_selected" android:state_selected="true" />
<item android:drawable="@drawable/button_sign_in_background_normal" />
</selector>
button_sign_in_background_normal.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
android:visible="true">
<corners android:radius="@dimen/abc_control_corner_material" />
<solid android:color="@color/color_primary" />
</shape>
button_sign_background_selected.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/abc_control_corner_material" />
<solid android:color="@color/color_primary_dark" />
</shape>
我在两种不同的设备上进行了测试,一种是API 21,另一种是API 10。背景button_sign_in_background.xml
无法在API 10中显示,但是它适用于 API 21 台设备。
如果我直接在 button_sign_in_background.xml
中使用颜色,如下所示,两种设备都可以工作。但这不是我需要的效果,我想要的是一个小半径的角围绕按钮。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/color_primary_dark" android:state_focused="true" />
<item android:drawable="@color/color_primary_dark" android:state_pressed="true" />
<item android:drawable="@color/color_primary_dark" android:state_selected="true" />
<item android:drawable="@color/color_primary" />
</selector>
这是旧 android 设备的兼容性问题吗?
我该如何解决?欢迎任何形式的评论和回答。
如果你想要小半径角按钮,下面的代码从API 10 到 Lollipop 都没有问题。
btn_done_background.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@drawable/shape_round_normal"/>
<item android:state_pressed="true" android:drawable="@drawable/shape_round_pressed"/>
</selector>
shape_round_normal.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/color_56b8e9"/>
<corners android:radius="4dp"/>
</shape>
shape_round_pressed.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/color_3ba2e1"/>
<corners android:radius="4dp"/>
</shape>
要应用的按钮
我使用 LinearLayout
作为按钮。
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="30dp"
android:id="@+id/linearLayoutButtonReply"
android:layout_centerVertical="true"
android:background="@drawable/btn_done_background"
android:clickable="true"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<ImageView
android:layout_width="15dp"
android:layout_height="15dp"
android:id="@+id/imageViewReply"
android:layout_marginRight="5dp"
android:layout_marginEnd="5dp"
android:duplicateParentState="true"
android:src="@drawable/ic_card_btn_answer"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textViewReplyCount"
android:duplicateParentState="true"
android:textColor="@android:color/white"
android:textSize="13sp"
android:text="@string/ReplyEmpty"
/>
</LinearLayout>
我使用下面的代码来解决兼容性问题。仅使用 API 级别 10 (Android 2.3.3) 进行测试。手动显示背景可绘制后,它工作正常。如果有更多版本存在此兼容性问题,欢迎评论。
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
mEmailSignInButton.setBackgroundDrawable(
getResources().getDrawable(R.drawable.button_sign_in_background));
}
我有一个带有可绘制选择器的按钮设置为背景。
button_sign_in_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_sign_in_background_selected" android:state_focused="true" />
<item android:drawable="@drawable/button_sign_in_background_selected" android:state_pressed="true" />
<item android:drawable="@drawable/button_sign_in_background_selected" android:state_selected="true" />
<item android:drawable="@drawable/button_sign_in_background_normal" />
</selector>
button_sign_in_background_normal.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
android:visible="true">
<corners android:radius="@dimen/abc_control_corner_material" />
<solid android:color="@color/color_primary" />
</shape>
button_sign_background_selected.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/abc_control_corner_material" />
<solid android:color="@color/color_primary_dark" />
</shape>
我在两种不同的设备上进行了测试,一种是API 21,另一种是API 10。背景button_sign_in_background.xml
无法在API 10中显示,但是它适用于 API 21 台设备。
如果我直接在 button_sign_in_background.xml
中使用颜色,如下所示,两种设备都可以工作。但这不是我需要的效果,我想要的是一个小半径的角围绕按钮。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/color_primary_dark" android:state_focused="true" />
<item android:drawable="@color/color_primary_dark" android:state_pressed="true" />
<item android:drawable="@color/color_primary_dark" android:state_selected="true" />
<item android:drawable="@color/color_primary" />
</selector>
这是旧 android 设备的兼容性问题吗?
我该如何解决?欢迎任何形式的评论和回答。
如果你想要小半径角按钮,下面的代码从API 10 到 Lollipop 都没有问题。
btn_done_background.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@drawable/shape_round_normal"/>
<item android:state_pressed="true" android:drawable="@drawable/shape_round_pressed"/>
</selector>
shape_round_normal.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/color_56b8e9"/>
<corners android:radius="4dp"/>
</shape>
shape_round_pressed.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/color_3ba2e1"/>
<corners android:radius="4dp"/>
</shape>
要应用的按钮
我使用 LinearLayout
作为按钮。
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="30dp"
android:id="@+id/linearLayoutButtonReply"
android:layout_centerVertical="true"
android:background="@drawable/btn_done_background"
android:clickable="true"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<ImageView
android:layout_width="15dp"
android:layout_height="15dp"
android:id="@+id/imageViewReply"
android:layout_marginRight="5dp"
android:layout_marginEnd="5dp"
android:duplicateParentState="true"
android:src="@drawable/ic_card_btn_answer"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textViewReplyCount"
android:duplicateParentState="true"
android:textColor="@android:color/white"
android:textSize="13sp"
android:text="@string/ReplyEmpty"
/>
</LinearLayout>
我使用下面的代码来解决兼容性问题。仅使用 API 级别 10 (Android 2.3.3) 进行测试。手动显示背景可绘制后,它工作正常。如果有更多版本存在此兼容性问题,欢迎评论。
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
mEmailSignInButton.setBackgroundDrawable(
getResources().getDrawable(R.drawable.button_sign_in_background));
}