Используя onClick on TextView с возможностью выбора текста - как избежать двойного щелчка?
Это так странно, но если вы установите onClickListener в TextView (или редактируемый EditText), который имеет android:textIsSelectable="true"
- ему не нужен один кран, а два.
Я проверил его на 3 телефонах, и все они выполняют onClick только после второго нажатия.
Конечно, если вы делаете focusable="false"
или android:textIsSelectable="false"
, он работает с первого нажатия, но выбор текста не работает.
Пожалуйста, помогите мне с этой проблемой
Ответы
Ответ 1
У меня была такая же проблема, и мне было сложно спросить и найти разрешение.
Вот две вещи, которые я заметил в дополнение к поведению двойного крана:
- Если вы действительно дважды нажмите (быстро) на TextView с помощью
textIsSelectable
, он выбирает слово, которое вы прослушивали, даже если фокус находится на чем-то другом, что означает, что вид каким-то образом зарегистрировал первое нажатие.
- Если вы долго нажимаете, когда фокус находится где-то в другом месте, он работает и запускает режим действия выбора, как если бы он был сфокусирован уже
Вот как мне удалось заставить его работать. Это не красиво, но все работает отлично: в XML вам нужно добавить textIsSelectable
, никаких других атрибутов focusable
/focusableInTouchMode
/clickable
/enabled
; то вам понадобятся два прослушивателя, один из которых - это существующий onClick
, который работает, но ему требуется двойной выбор, а другой - onFocusChange
, где вы обрабатываете исключительный первый щелчок:
hint = (TextView)view.findViewById(R.id.hint);
hint.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
handleHintClick();
}
});
hint.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) { handleHintClick(); }
}
});
Вот альтернативное решение в связанном с этим вопросе, который мне не нравится и даже не пытался: оберните TextView в FrameLayout и добавьте слушателя в что.
Вот еще один связанный вопрос, который имеет больше решений.
Ответ 2
Установите XML в свой TextView
android:textIsSelectable="true"
После этого установите TextTouchListener в TextView и в них сделайте следующее:
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) view.requestFocus();
Он устанавливает фокус для каждого нажатия на TextView.
После того, как вы установите onClickListener в свой TextView.
У меня такая же проблема с держателем для моего пользовательского RecyclerView.Adapter. Итак, я отрезал его для вас, если вам нужно:
class RollHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnTouchListener {
private TextView textView;
RollHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.text_view);
textView.setOnClickListener(this);
textView.setOnTouchListener(this);
}
@Override //Слушатель нажатия
public void onClick(View view) {
switch (view.getId()){
case R.id.text_view:
//Do here that you need
break;
}
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (view.getId()){
case R.id.text_view:
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) view.requestFocus();
break;
};
return false;
}
}
Ответ 3
Используйте onTouchListener
для обнаружения кликов и перенаправления их в представление контейнера:
textView.setOnTouchListener { _, event ->
if (event.action == 1 && !textView.hasSelection()) {
containerView.callOnClick()
}
false
}
Это сохранит возможность выбора и отмены выбора текста без вызова события onClick
.
Ответ 4
android:longClickable="false"
android:clickable="false"
Отключить кнопку с помощью setEnabled(false)
, пока пользователь не сможет снова щелкнуть его.
Помогите с этим
Ответ 5
Попробуйте это.
использовать в файле XML
android:onclick"your Name"//for example I used "onImageListClick"
public void onImageListClick(View view)
{
//do your task.
//Intent intent = new Intent(this, ImageListActivity.class);
//intent.putExtra(Extra.IMAGES, IMAGES);
//startActivity(intent);
}
или
txtboxname.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
////do you task.
}
});