在Jake Wharton的ViewPagerIndicator中支持android:state_first =“true”?

时间:2013-01-21 14:50:51

标签: android viewpagerindicator

我有一个自定义主题应用到我使用Jake Wharton的greate ViewPagerIndicator库的应用程序。不幸的是,主题要求第一个和最后一个Tab指示符具有圆形外端。

它应该是这样的:

should look like so

我认为我可以使用特殊的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状态,看起来像那样:

仅适用于此外观:

enter image description here

我已经查看了代码,但标签只是TabView中的一堆TextView s(来自HorizontalScrollView),我想这并不是t支持那些状态属性。

任何人都有实施或想法来解决这个问题吗?

2 个答案:

答案 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)
    }
}