多次使用Androids TouchDelegate苦苦挣扎

时间:2017-04-20 15:03:36

标签: android android-layout user-interface touch android-view

我有一个带有根元素LinearLayout的布局,其中包含另外两个LinearLayouts,它们构成了两行。那些分别包含Switch

实际上看起来有点像这样:example picture

这是我的示例布局文件的样子:

<LinearLayout android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <LinearLayout android:id="@+id/layout_row_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Switch android:id="@+id/switch_row_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout android:id="@+id/layout_row_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Switch android:id="@+id/switch_row_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>

现在,我想要完成的是,触摸第一个LinearLayout的区域将触发第一个Switch并触及第二个LinearLayout的区域将触发第二个Switch {1}}。

正如Is there an example of how to use a TouchDelegate in Android to increase the size of a view's click target?How To Use Multiple TouchDelegate中所述,我使用TouchDelegate将Switch的可触摸区域增加到其父ViewLinearLayout。< / p>

以下是我的方法:

public static void expandTouchArea(final View smallView, final View largeView) {
largeView.getViewTreeObserver().addOnGlobalLayoutListener(
        new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect delegateArea = new Rect();
                largeView.getHitRect(delegateArea);
                TouchDelegate delegate = new TouchDelegate(delegateArea, smallView);
                largeView.setTouchDelegate(delegate);
            }
        });
}

在我的onCreate()中,我将其称为两行:

mLayoutRow1 = findViewById(R.id.layout_row_1);
mLayoutRow2 = findViewById(R.id.layout_row_2);

mSwitchRow1 = (Switch) findViewById(R.id.switch_row_1);
mSwitchRow2 = (Switch) findViewById(R.id.switch_row_2);

expandTouchArea(mSwitchRow1, mLayoutRow1);
expandTouchArea(mSwitchRow2, mLayoutRow2);

我无法理解的是,对于第1行,它正在工作,但对于第2行(以及对expandTouchArea的任何其他连续调用),它不起作用。

我还尝试不添加OnGlobalLayoutListener,而是将Runnable发布到Switch本身的事件消息队列中,从而产生完全相同的行为。

所以到目前为止我无法回答的问题是:是否可以为不同的TouchDelegates设置多个LinearLayouts,以便将触摸事件路由到Switches分别在一个布局中?

1 个答案:

答案 0 :(得分:0)

我发现当我在每行周围添加另一个LinearLayout时,TouchDelegates都可以正常工作。

现在我的示例布局文件如下所示:

<LinearLayout android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout android:id="@+id/layout_row_1"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content" >

            <Switch android:id="@+id/switch_row_1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout android:id="@+id/layout_row_2"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content" >

            <Switch android:id="@+id/switch_row_2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

也许有另一种解决方案。这个似乎有点单调乏味。