如何在焦点ViewGroup中激活TextView的选取框?

时间:2010-12-17 19:43:29

标签: android

这是一个布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <RelativeLayout
        android:id="@+id/first_tv_container"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:background="@android:drawable/list_selector_background">
        <TextView
            android:id="@+id/first_tv"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
            android:singleLine="true"
            android:ellipsize="marquee"
            android:duplicateParentState="true"/>
    </RelativeLayout>
    <TextView
        android:id="@+id/second_tv"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:background="@android:drawable/list_selector_background"/>
</LinearLayout>

当second_tv获得焦点时,second_tv的选框将按预期激活。当first_tv_container获得焦点时,我希望first_tv的选择也是如此。我认为将duplicaParentState = true添加到first_tv就可以了,但事实并非如此。所以我的问题是:有没有一种标准的,简单的方法让TextView的选框在一个专注的ViewGroup内工作(除了ListView,它能自动正确地处理案例)而不扩展和覆盖很多东西?

此致

1 个答案:

答案 0 :(得分:1)

好的,我找到了某种方式。我将first:focusable =“true”添加到first_tv,并将first_tv_container实例化为RelativeLayout的扩展版本,其中我声明了descendantFocusability =“blocksDescendants”并定义了以下覆盖:

@Override
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect)
{
    super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);

    setSelected(gainFocus);
    dispatchSetSelected(gainFocus);
}

正是我想避免的那种东西,但现在就可以了。