Android布局的xml选择器

7
我想知道是否有像drawable一样的布局选择器。
具有drawable选择器的示例:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- When selected -->
<item android:drawable="@drawable/tab_library_clicked"
      android:state_selected="true" />
<!-- When not selected -->
<item android:drawable="@drawable/tab_library_not_clicked" />

但是是否有可能像这样实现(下面的代码对我来说无效,但应该能给你一个想法):
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- When selected -->
<item android:layout="@layout/tab_library_clicked"
      android:state_selected="true" />
<!-- When not selected -->
<item android:layout="@layout/tab_library_not_clicked" />


你计划如何使用这个东西? - Mr.Me
@Mr.Me 我想在TabSpec.setIndicator()中使用这个。我尝试了我链接的第一个xml代码,但是图像没有填充指定的选项卡以达到良好的外观效果。但是当我创建了一个带有ImageView的布局,并将宽度和高度设置为match_parent以填充选项卡时,它看起来更好,所以我想知道是否有一种方法可以使用我放置的第二个xml代码。 - JoeyL
4个回答

3

我可能错了,但我很确定这个不存在。

在XML中,您可以使用可绘制层列表将几个可绘制对象组合成一个状态,这可能是您能够使用选择器的最“复杂”方式。

或者,您可以尝试使用touch_down和touch_up事件来以编程方式调用setVisibility()函数,但我想性能会非常差。


可绘制列表在这种情况下非常有用。 - Braj

1

好的,您要寻找的是一种将父级状态传播到其子视图的方法。这样,每当指示器状态更改(选中或未选中),图像视图状态也会更改。

Android已经有了一个用于此的XML属性。

android:duplicateParentState="true"

在布局文件中,与选择器结合使用该方法来处理子视图。例如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#f00" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:duplicateParentState="true"
     />

<ImageView
    android:id="@+id/imageView1"
    android:duplicateParentState="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:src="@drawable/selector" />


1

默认选择器机制只提供了针对视图状态的属性替代方案(例如使用的可绘制对象等),但它并不会替换视图本身。你所要求的功能是无法实现的。

视图的选定状态绑定在 View 类中 *_STATE_SET 字段的一个值上。视图的组合状态通过 getDrawableState() 获取。

你可以扩展一个 View 类并利用这些状态来进行自定义操作。或者,你可以开发一个自定义布局控制器,观察 View 树中的状态变化,并根据 xml 资源替换子视图。

但是这样做的努力是不值得的,因为:

  1. 用户与之交互时,视图/布局结构必须保持不变。当用户选择一个按钮时,你不应该将其更改为复选框,这样替换视图/布局只会在用户体验上造成混乱。

  2. 你只需要在用户交互时修改视图的外观,而选择器基于可绘制对象和颜色已经提供了这一功能。


0

文档中,item没有android:layout属性。它应该与android:drawable一起使用。


我知道这个。我想问的是,是否有任何东西可以根据state_selected选择布局,就像对于drawables一样。 - JoeyL
那就是我实际上回答的内容。我也可以回答“抱歉,这是不可能的!”但我想给你一些解释,我认为在你的情况下并不太好。 :) - waqaslam
不,你没有回答我的问题。我不是在问 <item> 是否存在/有效的 android:layout,我知道这一点,因为它并没有像我在原帖中说的那样工作。我想知道的是,是否有任何东西可以模拟第二个 XML 代码中所提供的所有 XML 逻辑。如果“不可能”,那么请给我一个理由,比如在 xml 中没有这样的属性,因此你不能做这样的事情,而不仅仅是针对 <item> :)。 - JoeyL
该项具有有限的范围,仅适用于可绘制对象。并非所有属性都适用于所有不同类型的标记。您不能因为在框架中可用就认为一个标记可用的属性必须在另一个标记中也可用。 - waqaslam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接