使用带有可选文本的onView on TextView - 如何避免双击?

问题描述 投票:11回答:5

这很奇怪,但是如果你在一个带有android:textIsSelectable="true"的TextView(或不可编辑的EditText)上放一个onClickListener - 它不需要一次点击,而是两次。我在3部手机上检查了它,所有这些都只在第二次点击后执行onClick。

当然,如果你制作focusable="false"android:textIsSelectable="false"它可以从第一次点击,但文本选择不起作用。

请帮我解决这个问题

android onclick textview onclicklistener
5个回答
1
投票

我有同样的问题,很难提出并寻找解决方案。

除了双击行为之外,我还注意到以下两件事:

  • 如果你真的用textIsSelectable双击(快速)TextView,它会选择你点击的单词,即使焦点在其他东西上,这意味着视图也以某种方式记录了第一次触摸。
  • 如果您在焦点位于其他位置时长时间点击,则它会起作用并启动选择操作模式,就像它已经聚焦一样

这就是我设法让它发挥作用的方式。它并不漂亮,但到目前为止一切正常:在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(); }
    }
});

这是一个相关问题中的alternative solution,我不喜欢甚至没有尝试:将TextView包装在FrameLayout中并添加侦听器。

这是另一个有更多解决方案的related question


1
投票

在XML中设置为TextView

android:textIsSelectable="true"

之后将onTouchListener设置为TextView并在其中执行以下操作:

if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) view.requestFocus(); 

它为TextView上的每个点击设置了焦点。毕竟将onClickListener设置为TextView。

我的自定义RecyclerView.Adapter的Holder遇到了同样的问题。所以,如果你需要,我会为你剪掉它:

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;
    }
}

0
投票

使用onTouchListener检测点击并将其重定向到容器视图:

textView.setOnTouchListener { _, event ->
    if (event.action == 1 && !textView.hasSelection()) {
        containerView.callOnClick()
    }
    false
}

这将保留在不调用onClick事件的情况下选择和取消选择文本的功能。


-1
投票
android:longClickable="false"
android:clickable="false"

使用setEnabled(false)禁用该按钮,直到用户再次单击它是安全的。

May this helpful to you


-2
投票

试试这个。

在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.
       }        
});
© www.soinside.com 2019 - 2024. All rights reserved.