我正在测试创建复合视图,所以我开始使用包含ImageView和TextView的线性布局。这些LinearLayout将表示类似于部分列表的视图,我将其设为可点击。布局的内部视图将选择器作为其颜色(TextView)和图像(ImageView)。在API 19(KitKat)中,点击行为是正常的(屏幕截图1),但在API 15和API 10(屏幕截图2)上,点击没有改变选择器状态。
每个'列表项的代码'是:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/listitem_login"
android:clickable="true"
android:gravity="center"
android:orientation="horizontal"
android:padding="15dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:src="@drawable/signin_signup_icon_facebook" />
<TextView
style="?android:attr/textAppearanceMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Facebook"
android:textColor="@color/option_text_color" />
</LinearLayout>
编辑:我使用了触控侦听器方法。如果有一天我找到了最好的解决方案(没有Java代码),我在这里编辑。我的方法,基于答案(将View.OnTouchListener添加到LinearLayouts):
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
ViewGroup container = (ViewGroup) view;
boolean pressed;
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) pressed = true;
else if (motionEvent.getAction() == MotionEvent.ACTION_UP) pressed = false;
else return false;
for (int i = 0; i < container.getChildCount(); i++) {
container.getChildAt(i).setPressed(pressed);
}
return false;
}
在旧的2.3 Android中,代码运行有点慢但也有效。
答案 0 :(得分:3)
我尝试过不同的API并且遇到了同样的问题。我认为旧的API可能没有此功能,允许内部视图的外观响应它的父视图的点击方法。
您可以使用touchListenr更改代码中的内部视图外观,或者您可以尝试不使用LinearLayout但只使用带有图片的TextView,使用android:drawableLeft
,然后您可以更改两个图像和文本和背景同时。
编辑: 像这样使用onTouchListener:
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
imageView.setPressed(true);
textView.setPressed(true);
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
imageView.setPressed(false);
textView.setPressed(false);
}
return false;
}
希望它可以帮助你。
答案 1 :(得分:1)
你不应该使用4种布局进行相同类型的布局,更好的方法是使用listview。但这也可以这样解决:
为线性布局设置ontouchlistner
case MotionEvent.ACTION_DOWN:
//change image view (white image) and text color(white) and linear layout background color(Red) here
break;
case MotionEvent.ACTION_UP:
//change image view (red image) and text color(red) and linear layout background color(white) here
break;
这将解决您的问题,并且它肯定会像魅力一样工作,或者您可以使用线性布局像按钮一样工作,并为此布局设置选择器: Making a LinearLayout act like an Button
答案 2 :(得分:0)
尝试类似的东西:
您的Xml文件
<LinearLayout
android:id="@+id/linearLaout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/listitem_login"
android:clickable="true"
android:gravity="center"
android:orientation="horizontal"
android:padding="15dp">
<ImageView
android:id="@+id/iamge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:src="@drawable/signin_signup_icon_facebook" />
<TextView
android:id="@+id/textView"
style="?android:attr/textAppearanceMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Facebook"
android:textColor="@color/option_text_color" />
</LinearLayout>
简单地单击更改线性布局颜色的背景 并且还可以更改图像视图的背景,还可以选择文本视图的颜色。和其他人一样。
检查链接是否像该选择器一样使用Android LinearLayout Selector background color