Используя 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.
       }        
});