繁体   English   中英

EditText,OnTouchListener和setSelection在第一次触摸时不起作用

[英]EditText, OnTouchListener and setSelection doesn't work on first touch

我有以下代码,每次触摸我的“redTime”EditText时都会触发。

redTime.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.i("click", "onMtouch");
            redTime.setSelection(redTime.getText().length());
            return false;
        }
    });

它意味着在每次触摸时将光标保持在EditText的右侧。 问题是包含“setSelection”方法的行在第一次触摸控件时不起作用。 也就是说,如果另一个控件具有焦点,并且我第一次触摸“redTime”控件,则触发该方法,但是光标保持在我触摸的位置(而不是右侧)。

我如何知道听众的火灾? “Log.i”调用有效,但光标没有变化。 我怀疑“setSelection”调用正在运行,但后来的一些事件正在否定它。

我试了几件事。 我尝试通过在侦听器中返回TRUE来使用该事件。 没工作。 我尝试在OnTouchListener和OnFocusChanged中重复“setSelection”调用。 仍然无法正常工作。

我差点忘了。 这是有问题的控件的XML。

<EditText
            android:id="@+id/redEditText"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:ellipsize="end"
            android:gravity="right"
            android:inputType="time"
            android:text="@string/zeroTime"
            android:textColor="#ff0000"
            android:textSize="32sp" >
        </EditText>

我最近遇到了这个问题并且无法正常工作,所以最终做到了这一点:

    setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    setSelection(getText().length());
                }
            }, 50);
            return false;
        }
    });

只需将edittext放在下面

   <EditText    
    android:id="@+id/from"
    android:focusable="false" 
    android:hint="@string/pickup_location"
    android:imeOptions="actionNext"  
    android:inputType="textNoSuggestions"    
    android:padding="10dp"
    android:textColor="@android:color/white" />

在活动中设置ontouch侦听器

 EditText et = (EditText)findViewById(R.id.et); et.setOnTouchListener(this)



@Override   public boolean onTouch(View v, MotionEvent event) {     
if (event.getAction() == MotionEvent.ACTION_UP)     
    switch (v.getId()) {            
            case R.id.from:
                //do your action
                break;

使用此方法:

redTime.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction()==MotionEvent.ACTION_UP){  //check the event
                 redTime.requestFocus();  //keep focus on the EditText(redTime)
                 redTime.selectAll();  //select all text
            }

        }
        return true;
});

你可以做到

redTime.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.i("click", "onMtouch");
        redTime.setFocusable(true);
        redTime.requestFocus();
        redTime.setSelection(redTime.getText().length());
        return false;
    }
});

在调用setSelection之前, redTime将在您进行选择时获得焦点。

为了避免错误,请执行以下操作:

yourEditText.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                yourEditText.setFocusable(true);
                yourEditText.requestFocus();
                yourEditText.setSelection(emailEditText.getText().length());
                break;
            case MotionEvent.ACTION_UP:
                v.performClick();
                break;
            default:
                break;
            }
            return true;

        }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM