我有一个自定义主题应用到我使用Jake Wharton的greate ViewPagerIndicator库的应用程序。不幸的是,主题要求第一个和最后一个Tab指示符具有圆形外端。
它应该是这样的:
我认为我可以使用特殊的selector
drawable来实现这个,如下所示(简化),但显然不支持state_first,state_middle,state_last - 当我使用它们时背景是空白的,而它是&# 39;没关系(除了最外面的标签)我没有。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- middle buttons -->
<item android:state_middle="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/groupbutton_normal" />
<item android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/groupbutton_pressed" />
<!-- first button -->
<item android:state_first="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/groupbutton_first_normal" />
<item android:state_first="true" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/groupbutton_first_pressed" />
<!-- lastbutton -->
<item android:state_last="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/groupbutton_first_normal" />
<item android:state_last="true" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/groupbutton_first_pressed" />
</selector>
它没有middle, first, last
状态,看起来像那样:
仅适用于此外观:
我已经查看了代码,但标签只是TabView
中的一堆TextView
s(来自HorizontalScrollView
),我想这并不是t支持那些状态属性。
任何人都有实施或想法来解决这个问题吗?
答案 0 :(得分:1)
我有同样的问题我通过制作三个选择器解决了它,一个用于中间按钮,另一个用于第一个按钮,另一个用于最后一个按钮。然后我必须在每个按钮的布局文件中设置正确的选择器。
我知道这只是一种解决方法,并没有解决android:state_first =“true”的问题,但至少你的布局看起来不错。
答案 1 :(得分:0)
通过搜索Android源代码,看起来好像只在某些动画文件的文档中提到了它。并在R类中声明为资源/属性。期间。
我在API 21、22和25中进行了搜索。
是的,它看起来像“根本没用”。
自行实现状态
您可以扩展一个类并实现它。如果您已经在创建自己的视图,或者这是一个合适的解决方案。
在这种情况下:
enum class Position(val stateIds: IntArray) {
FIRST(intArrayOf(android.R.attr.state_first)),
MIDDLE(intArrayOf(android.R.attr.state_middle)),
LAST(intArrayOf(android.R.attr.state_last))
}
class YourView {
var position: Position = Position.MIDDLE
set(value) {
field = value
// tell Android state changed
refreshDrawableState()
}
// tell Android the current state: parent class state + position state
override fun onCreateDrawableState(extraSpace: Int): IntArray {
return super.onCreateDrawableState(extraSpace + 1).also {
// one small issue is this method gets called in parent's initialization
// before this class's fields got initialized. So you can
// use a nullable field and check for null here, maybe.
// Which would work as "NONE" value.
View.mergeDrawableStates(it, stateIds)
}
}