具有内部视图行为问题的可点击布局

时间:2014-04-29 04:16:51

标签: java android android-layout

我正在测试创建复合视图,所以我开始使用包含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>

API 19

API 15

编辑:我使用了触控侦听器方法。如果有一天我找到了最好的解决方案(没有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中,代码运行有点慢但也有效。

3 个答案:

答案 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