EditText获取被点击的字符,并选中(解决越界,解决不能获取焦点)

 
//触摸监听
edit01.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //如果未输入,不监听
        if (edit01.getText().length() == 0) {
            return false;
        }
	int px;//触摸的x轴位置
        switch (event.getAction()) { 
		case MotionEvent.ACTION_UP:
			px = (int) event.getX();                
			int index = edit01.getOffsetForPosition(px, 0) - 1;                
			edit01.setSelection(index, index + 1);
			//打开键盘
	        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
	        // imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
	        imm.showSoftInput(edit01,InputMethodManager.SHOW_FORCED);
        }

        return true;
    }
});

 
补充:
1:居中或者居右,触摸到第一个字符前,
//触摸监听
edit01.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //如果未输入,不监听
        if (edit01.getText().length() == 0) {
            return false;
        }
	int px;//触摸的x轴位置
        switch (event.getAction()) { 
		case MotionEvent.ACTION_UP:          
			px = (int) event.getX();                
			int index = edit01.getOffsetForPosition(px, 0); 
			//防止越界
			index = index==0?1:(index>edit01.getText().length?edit01.getText().length:index);        
			edit01.setSelection(index-1, index);
			//打开键盘
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            // imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
            imm.showSoftInput(edit01,InputMethodManager.SHOW_FORCED);
        }
        return true;
    }
});
2:触摸获取焦距失灵
editPlate.requestFocusFromTouch();
requestFocus() 方法在三种情况下获取焦点不能生效。
1)对应的View不支持Focus;
2) 对应的View支持Focus,但是不支持在Touch模式下的Focus;
3) 对应的View其祖先View 设置了FOCUS_BLOCK_DESCENDANTS 标志, 阻止其子View获取焦点。

3:选中字符灵敏性升级

在使用过程中发现,在EditText中,点击1的位置会选择字符‘b’,点击2的位置会选择c;
推测可能是由于 edit01.getOffsetForPosition(px, 0);在判断自附的时候做了类似四舍五入的事情,
完整修改如下
edit01.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //如果未输入,不监听
        if (edit01.getText().length() == 0) {
            return false;
        }
	int px;//触摸的x轴位置
        switch (event.getAction()) { 
		case MotionEvent.ACTION_UP: 
			px = (int) event.getX()+ (int) editPlate.getTextSize() / 2; //点击位置加上字符大小的一半
			int index = edit01.getOffsetForPosition(px, 0); 
			//防止越界
			index = index==0?1:(index>edit01.getText().length?edit01.getText().length:index);        
			edit01.setSelection(index-1, index);
			//打开键盘
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            // imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
            imm.showSoftInput(edit01,InputMethodManager.SHOW_FORCED);
        }
        return true;
    }
});


可能不会再更新了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值