触摸 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_UP
或 ACTION_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
相反。
我在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_UP
或 ACTION_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
相反。