触摸 TextInputLayout 中的 EditText 会生成两个或多个事件

One touch on EditText inside TextInputLayout generate two or more events

我在TextInputLayout里面有一个EditText:

    <android.support.design.widget.TextInputLayout
    android:id="@+id/inputLayoutDoB"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/stepViewIndicator"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    app:hintTextAppearance="@style/TextAppearance.App.TextInputLayout"
    app:errorTextAppearance="@style/Text.Appearance.App.ErrorText"
    android:textColorHint="@color/colorAccentLight">

    <android.support.v7.widget.AppCompatEditText
        android:id="@+id/inputDoB"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableStart="@drawable/ic_profile_calendar"
        android:drawablePadding="@dimen/form_drawable_margin"
        android:hint="@string/strHintDoB"
        android:textSize="@dimen/input_text"
        android:inputType="date"
        android:textColor="@android:color/white"/>

</android.support.design.widget.TextInputLayout>

我的 RelativeLayout 旨在防止禁用视图自动对焦:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/colorAccent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:focusableInTouchMode="true">

现在,我需要在上面的 EditText 上管理触摸手势,弹出一个简单的 AlertDialog:

inputDoB = findViewById(R.id.inputDoB);
// *** PREVENT SOFT KEYBOARD APPEARANCE
inputDoB.setInputType(InputType.TYPE_NULL);
inputDoB.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            AlertDialog alertDialog = new 
            AlertDialog.Builder(ProfileActivity_Step1.this).create();
            alertDialog.setTitle("Alert");
            alertDialog.setMessage("Alert message to be shown");
            alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
            alertDialog.show();
            return false;
        }
    });

似乎一切正常,但是当我 click/touch EditText 时,两个或更多 AlertDialog 出现。

此行为是否与 EditText 容器 (TextInputLayout) 有关? 如果是,我该如何解决这个问题?

有什么想法吗?

非常感谢您的支持

onTouch() 方法可以多次调用,以实现您(作为人类)认为的 "single" 触摸。至少,将有一个 ACTION_DOWN 事件后跟一个 ACTION_UPACTION_CANCEL 事件。但是,如果您在屏幕上移动手指,您也会收到 ACTION_MOVE 个事件。

因此,将您的方法更改为:

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        AlertDialog alertDialog = new 
        AlertDialog.Builder(ProfileActivity_Step1.this).create();
        alertDialog.setTitle("Alert");
        alertDialog.setMessage("Alert message to be shown");
        alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
        alertDialog.show();
    }
    return false;
}

此外,如果你想真正拦截触摸事件(并防止提示向上滑动,就好像 EditText 有焦点一样)你应该将此更改为 return true 相反。