2

我有一个 ImageButton 和一个包装该按钮的 LinearLayout,如下所示:

<LinearLayout
        android:id="@+id/homeButtonLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/p_buttons_background"
        android:orientation="vertical" >

        <ImageButton
            android:id="@+id/homeButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10px"
            android:background="@drawable/home_icon"
            android:onClick="goBackToCameraScreen" />
    </LinearLayout>

如上所示,我在 LinearLayout 中的 ImageButton 周围放置了一个背景。

当用户单击 ImageButton 时,我希望能够更改该背景(即LinearLayout的背景,而不是 ImageButton 的背景)。我可以以编程方式做到这一点,但我想通过 XML 做到这一点。我可以通过编写选择器轻松更改ImageButton的背景,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="true"
       android:drawable="@drawable/button_pressed" /> <!-- pressed -->
     <item android:state_focused="true"
       android:drawable="@drawable/button_focused" /> <!-- focused -->
     <item android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>

正是我想要的,除了我想更改 LinearLayout 背景,而不是 ImageButton 背景。我怎样才能像上面那样创建一个 XML 选择器,但这实际上改变了 LinearLayout 的背景而不是 ImageButton 背景?

先感谢您!!=)

4

2 回答 2

4

将选择器设置为您的LinearLayout并添加android:descendantFocusability="blocksDescendants"到它。

在选择器中,将所有按钮背景替换为布局背景。

<LinearLayout
    android:id="@+id/homeButtonLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/layout_bg_selector"
    android:orientation="vertical" 
    android:descendantFocusability="blocksDescendants">

    <ImageButton
        android:id="@+id/homeButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10px"
        android:background="@drawable/home_icon"
        android:onClick="goBackToCameraScreen" />
</LinearLayout>

选择器layout_bg_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:drawable="#F0F0F0" /> <!-- pressed -->
     <item android:state_focused="true"
       android:drawable="#00F000" /> <!-- focused -->
     <item android:drawable="#0000F0" /> <!-- default -->
</selector>
于 2012-06-04T04:22:12.693 回答
1

我认为提问者现在已经死了:XD

但这是解决方案

将这两行代码添加到您的布局中:

android:clickable = "true"

android:focusable = "true"

主要样本是

我们有这样的约束布局:

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/layoutSample"
    android:layout_width="150dp"
    android:layout_height="120dp"
    android:background="@drawable/layout_selector"
    android:clickable="true"
    android:focusable="true">
</androidx.constraintlayout.widget.ConstraintLayout>

和(layout_selector.xml)像这样:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bg_pressed" android:state_pressed="true" /> <!-- pressed -->
    <item android:drawable="@drawable/bg_focused" android:state_focused="true" /> <!-- focused -->
    <item android:drawable="@drawable/bg_default" /> <!-- default -->
</selector>

以及我们在选择器中使用的(bg_pressed.xml)和(bg_focused.xml)和(bg_default.xml),然后我们需要在drawable文件夹中声明它们,例如:

bg_pressed.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <corners android:radius="8dp" />
    <solid android:color="#ffffff" />

    <stroke
    android:width="2dp"
    android:color="#00ff00" />
</shape>

bg_focused.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <corners android:radius="8dp" />
    <solid android:color="#ffffff" />

    <stroke
    android:width="2dp"
    android:color="#ff0000" />
</shape>

bg_default.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <corners android:radius="8dp" />
    <solid android:color="#ffffff" />
</shape>

现在将您的图像视图或其他内容放入布局中并尝试点击:)(阅读问题!)

希望对你有帮助 ...

于 2020-06-15T06:20:13.800 回答