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

时间:2014-06-20 21:24:06

标签: java android user-interface android-edittext

我每次触摸“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>

5 个答案:

答案 0 :(得分:5)

我最近遇到了这个问题,无法解决任何问题,所以最终做到了这一点:

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

答案 1 :(得分:3)

只需将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;

答案 2 :(得分:2)

使用此方法:

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

答案 3 :(得分:1)

你可以做到

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之前,{E-1}}会在您进行选择时获得焦点。

答案 4 :(得分:1)

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

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;

        }
    });