如何使EditText的父级可点击?

时间:2017-04-17 09:49:44

标签: android android-edittext xamarin.android

假设我有这个粉红色的盒子:

pinku bokkusu

它由LinearLayout及其子项组成:TextView作为字段名称和EditText。故意禁用EditText。我想要的是,用户可以在粉红色的盒子上点击用户想要的任何地方。顺便说一句,请忽略您发现的任何UI / UX事物。

我已尝试过,但用户无法点按EditText占用的区域。用户必须点击粉红色框上的TextView或空白区域,以便应用获得“点击”。但如果用户点击EditText区域,则不会发生任何事情。

我尝试过在xml的属性中玩一些东西,比如设置LinearLayout&#39 {s} clickabletrue,以及所有的孩子或者只有EditTextclickablefocusablefocusableInTouchMode的{​​{1}}属性,都无济于事。 <{1}}区域仍然无法点击。

有什么想法吗?无法通过xml访问它?是否应以编程方式完成旁路false的点击?

2 个答案:

答案 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()));