假设我有这个粉红色的盒子:
它由LinearLayout
及其子项组成:TextView
作为字段名称和EditText
。故意禁用EditText
。我想要的是,用户可以在粉红色的盒子上点击用户想要的任何地方。顺便说一句,请忽略您发现的任何UI / UX事物。
我已尝试过,但用户无法点按EditText
占用的区域。用户必须点击粉红色框上的TextView
或空白区域,以便应用获得“点击”。但如果用户点击EditText
区域,则不会发生任何事情。
我尝试过在xml的属性中玩一些东西,比如设置LinearLayout
&#39 {s} clickable
到true
,以及所有的孩子或者只有EditText
,clickable
和focusable
到focusableInTouchMode
的{{1}}属性,都无济于事。 <{1}}区域仍然无法点击。
有什么想法吗?无法通过xml访问它?是否应以编程方式完成旁路false
的点击?
答案 0 :(得分:1)
您只需添加onTouch Listener而不是单击Listener。
答案 1 :(得分:0)
如果您不想将它们全部绑定,则需要请求父布局(LinearLayout,无论如何)并循环浏览视图。如果使用数据绑定更容易。无论如何,这是一个解决方案(一小段代码必需!)。
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="out of focus"/>
<LinearLayout
android:id="@+id/linearTest"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="test for clicking"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="another clicking test"
/>
<EditText
android:id="@+id/editTest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="focus edittext when clicking linearlayout or other elements inside"
/>
</LinearLayout>
</LinearLayout>
代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.linear_focus_test);
final EditText editText = (EditText) findViewById(R.id.editTest);
LinearLayout linearTest = (LinearLayout) findViewById(R.id.linearTest);
for (int i = 0; i < linearTest.getChildCount(); i++)
View v = linearTest.getChildAt(i);
v.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
editText.requestFocus();
}
});
}
}
如果您不喜欢样板文件,您也可以使用lambda(使用1.8功能)
for (int i = 0; i < linearTest.getChildCount(); i++)
linearTest.getChildAt(i).setOnClickListener(v1 -> editText.requestFocus());
如果你至少使用API 24,你甚至可以缩短它:
IntStream.range(0, linearTest.getChildCount()).forEach(i -> linearTest.getChildAt(i).setOnClickListener(v1 -> editText.requestFocus()));