[英]Android - How can I create a selector for Layouts (like an ImageButton selector)
我有一个 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 背景?
先感谢您!! =)
将选择器设置为您的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>
我认为提问者现在已经死了: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>
现在将您的图像视图或其他内容放在布局中并尝试点击一些 :) (阅读问题!)
希望对你有帮助 ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.