我有一个带有根元素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
的可触摸区域增加到其父View
,LinearLayout
。< / 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
分别在一个布局中?
答案 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>
也许有另一种解决方案。这个似乎有点单调乏味。