1

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

它应该是这样的:

应该是这样的

我想我可以使用selector像下面这样的特殊可绘制对象(简化)来实现这一点,但显然不支持 state_first、state_middle、state_last - 当我使用它们时背景只是空白,而它没关系(除了最外面的选项卡)时我不。

<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状态的情况下工作,看起来像这样:

仅适用于这种外观:

在此处输入图像描述

我已经查看了代码,但选项卡只是 a 中的一堆TabViews (派生自TextViewHorizontalScrollView,我猜这不支持那些状态属性。

那么有没有人解决这个问题的实现或想法?

4

2 回答 2

1

我遇到了同样的问题,我通过制作三个选择器来解决它,一个用于中间按钮,另一个用于第一个按钮,另一个用于最后一个按钮。然后我必须在布局文件中为每个按钮设置正确的选择器。

我知道这只是一种解决方法,并不能解决 android:state_first="true" 问题,但至少您的布局看起来不错。

于 2013-10-02T09:22:10.667 回答
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)
    }
}
于 2018-12-13T20:03:01.303 回答