【问题标题】:set states programmatically Android以编程方式设置状态 Android
【发布时间】:2018-02-17 01:12:06
【问题描述】:

我有两个布局,每个布局都包含 2 个 TextView。代码是这样的

第一个布局

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="40dp"
    >
    <TextView
        android:id="@+id/total_hours_spend"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="@string/total_hours_spend"
        android:textSize="14sp"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:textStyle="bold"
        android:padding="@dimen/margin_padding_2dp"
        android:background="@drawable/rectangle_selector"/>
    <TextView
        android:id="@+id/total_budget_spend"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="@string/total_budget_spend"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:padding="@dimen/margin_padding_2dp"
        android:textStyle="bold"
        android:background="@drawable/rectangle_selector"
        android:textSize="14sp"/>
</LinearLayout>

二次布局

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/margin_padding_4dp"
    android:padding="@dimen/margin_padding_4dp"
    >
    <TextView
        android:id="@+id/training"
        android:layout_width="@dimen/margin_0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:layout_margin="@dimen/margin_padding_2dp"
        android:padding="@dimen/margin_padding_5dp"
        android:text="Trainings"
        android:textStyle="bold"
        android:gravity="center"
        android:textSize="17sp"
        android:background="@drawable/background_selector"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        />
    <TextView
        android:id="@+id/learning_programs"
        android:layout_width="@dimen/margin_0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="Learning Programs"
        android:padding="@dimen/margin_padding_5dp"
        android:textStyle="bold"
        android:textSize="@dimen/text_size_seventeen"
        android:background="@drawable/background_selector"
        android:gravity="center"
        android:clickable="true"
        android:focusable="true"
        android:focusableInTouchMode="true"
        />
</LinearLayout>

对于这两种布局,我需要在使用 item_selectors 的背景图像之间切换。类似这样的东西

Back_Selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true" android:state_enabled="true" android:drawable="@drawable/rounded_corner" />
        <item android:state_focused="true" android:drawable="@drawable/rounded_corner"/>

        <item android:drawable="@drawable/rounded_corner_grey"/>
    </selector>

和 Rectangle_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:state_enabled="true" android:drawable="@drawable/blue_rectangle"/>
    <item android:state_focused="true" android:drawable="@drawable/blue_rectangle"/>

    <item android:drawable="@drawable/grey_rectangle"/>
</selector>

屏幕的默认设计是 TextView Training 和 TextView Total hours spend 应使用选择器 xml 文件中设置的相应可绘制对象突出显示。此外,两种布局中的 TextView 之一应始终处于活动状态.

问题是应用启动时只有Training 被高亮显示。在第二个布局中,两个 textView 都处于非活动状态。

当我在第二个布局上单击某些内容时,第二个布局中的 TextViews 将变为非活动状态。

我的意思是,在 4 个文本视图中,有两个应该一直处于活动状态。 但是使用上面的代码,我只有一个 TextVIew 处于活动状态。

我应该在此处进行哪些更改?

【问题讨论】:

  • 你也可以发布 gray_rectangle、blue_rectangle、rounded_corner_grey、rounded_corner drawables 吗?
  • 可绘制对象只是图像@Raghavendra
  • 不活跃是什么意思?两个文本视图的文本大小不同,将 android:textSize="17sp" 设置为总小时数,看看你所期望的?
  • 活跃我的意思是,对于第一个布局,textview 应该有rounded_corner 背景,对于第二个布局,textview 应该有一个背景 og rectangle_blue
  • 我用过你的代码看起来很好我用了两个不同的图像 textview 在两个屏幕上突出显示。你可以仔细检查你的图像 blue_rectangle 和 gray_rectangle 一次吗?

标签: android xml android-layout layout


【解决方案1】:

发生的情况是每个文本视图一次可以有一个焦点(可绘制的焦点状态),因此如果您单击另一个 TextView,它将获得焦点而另一个失去焦点。

考虑到这一点,并且您需要 两个布局中的一个 TextView 应该始终处于活动状态,我能看到的解决您的问题的最佳解决方案是使用 2 @ 987654321@ 包含 2 个 RadioButtons 而不是 TextView:

第一个布局

<RadioGroup android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:weightSum="1">
    <RadioButton
        android:id="@+id/total_hours_spend"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:button="@null"
        android:text="@string/total_hours_spend"
        android:textSize="14sp"
        android:textStyle="bold"
        android:padding="@dimen/margin_padding_2dp"
        android:background="@drawable/rectangle_selector"/>
    <RadioButton
        android:id="@+id/total_budget_spend"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:button="@null"
        android:text="@string/total_budget_spend"
        android:padding="@dimen/margin_padding_2dp"
        android:textStyle="bold"
        android:background="@drawable/rectangle_selector"
        android:textSize="14sp"/>
</RadioGroup>

第二种布局

<RadioGroup android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/margin_padding_4dp"
    android:padding="@dimen/margin_padding_4dp"
    android:weightSum="1">
    <RadioButton
        android:id="@+id/training"
        android:layout_width="@dimen/margin_0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:layout_margin="@dimen/margin_padding_2dp"
        android:padding="@dimen/margin_padding_5dp"
        android:button="@null"
        android:text="Trainings"
        android:textStyle="bold"
        android:gravity="center"
        android:textSize="17sp"
        android:background="@drawable/background_selector"/>
    <RadioButton
        android:id="@+id/learning_programs"
        android:layout_width="@dimen/margin_0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:button="@null"
        android:text="Learning Programs"
        android:padding="@dimen/margin_padding_5dp"
        android:textStyle="bold"
        android:textSize="@dimen/text_size_seventeen"
        android:background="@drawable/background_selector"
        android:gravity="center"/>
</RadioGroup>

background_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@drawable/blue_rectangle"/>
    <item android:state_checked="false" android:drawable="@drawable/rounded_corner_grey"/>
    <item android:drawable="@drawable/rounded_corner_grey"/>
</selector>

rectangle_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@drawable/blue_rectangle"/>
    <item android:state_checked="false" android:drawable="@drawable/grey_rectangle"/>

    <item android:drawable="@drawable/grey_rectangle"/>
</selector>

这样它就会在你暴露的时候工作。

如果您仍想使用 TextView,我看到的唯一方法是以编程方式创建一个实现 Checkable 接口的 TextView,然后处理在每个布局中一次只检查一个的逻辑。我认为我提出的解决方案花费的时间更少,并且达到了预期的效果。

【讨论】:

  • 我不想要单选按钮,设计必须是 TextView 或普通按钮
  • @Aayushi 如果你使用单选按钮,它仍然会显示为 TextView,因为 android:button 设置为 @null。你有这个想法吗?除此之外,如果您可以使用按钮,那么单选按钮就是具有不同状态的按钮。请尝试我给你的解决方案,看看你是否得到你想要的。
  • 好的,我没有看到 android:button 为 null 。谢谢,我认为 state_selected:true 将适用于 TextView 但这也不起作用
  • 使用 TextView 所选状态将不起作用。仅当您创建了自己的实现 Checkable 接口的 TextView 时。看看上面的解决方案是否有效。
  • 您是否在 RadioGroup 中放置了单选按钮?你必须更具体地说明你做了什么,你想要什么以及你在实验时得到了什么。我一直在花时间回答这个问题,我认为这样做是对试图提供帮助的人的报应是礼貌的。
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2013-07-23
  • 2012-06-25
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多