您的位置:首页 > 其它

EditText特殊用法

2016-05-04 15:33 239 查看
实现的效果图:



思路:

1、往EditText中写入数据时,有一个集合存储要储存的数据所在EditText所在位置的开始位置和结束位置的值

2、在EditText中使用正则表达式匹配自己要匹配的数据,然后做相对应的处理

3、重写了EditText 的getSelectionStart和getSelectionEnd方法,根据自己需要做相应的处理

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:paddingBottom="@dimen/activity_vertical_margin"

tools:context="com.hh.imitationsinatopiceditview.MainActivity">

<com.hh.imitationsinatopiceditview.ui.ChildEditText

android:id="@+id/editText"

android:layout_width="match_parent"

android:layout_height="200dp" />

</RelativeLayout>

重新EditText

package com.hh.imitationsinatopiceditview.ui;

import android.content.Context;

import android.util.AttributeSet;

import android.widget.EditText;

import com.hh.imitationsinatopiceditview.bean.EditTextLocationBean;

import java.util.ArrayList;

import java.util.List;

/**

* Created by user on 2016/5/4.

*/

public class ChildEditText extends EditText {

private List<EditTextLocationBean> list = new ArrayList<>();

public ChildEditText(Context context, AttributeSet attrs) {

super(context, attrs);

}

public void setList(List<EditTextLocationBean> list) {

this.list = list;

}

@Override

public int getSelectionStart() {

int start = super.getSelectionStart();

for (EditTextLocationBean bean : list){

if (start > bean.getStartPoint() && start < bean.getEndPoint()){

//如果焦点小于内容的1/2,则停留在最前面;否则在后面

return start < ((bean.getEndPoint() - bean.getStartPoint())/2 + bean.getStartPoint()) ?

bean.getStartPoint() : bean.getEndPoint();

}

}

return start;

}

@Override

public int getSelectionEnd() {

int end = super.getSelectionEnd();

int start = super.getSelectionStart();

for (EditTextLocationBean bean : list){

if (end > bean.getStartPoint() && end<bean.getEndPoint()){ //焦点在内容区域内

if (end == start){//焦点重叠时,如果焦点小于内容的1/2,则停留在最前面;否则在后面

return end < ((bean.getEndPoint()-bean.getStartPoint())/2 + bean.getStartPoint()) ?

bean.getStartPoint(): bean.getEndPoint();

}else{

//双击选中匹配上内容时,重新设置选中内容开始和结束焦点

setSelection(bean.getStartPoint(),bean.getEndPoint());

}

}

}

return end;

}

}

代码里面有注释了,不做解释了

保存数据的实体bean

package com.hh.imitationsinatopiceditview.bean;

/**

* Created by user on 2016/5/4.

*/

public class EditTextLocationBean {

private int startPoint;

private int endPoint;

public EditTextLocationBean() {

}

public EditTextLocationBean(int startPoint, int endPoint) {

this.startPoint = startPoint;

this.endPoint = endPoint;

}

public void setStartPoint(int startPoint) {

this.startPoint = startPoint;

}

public void setEndPoint(int endPoint) {

this.endPoint = endPoint;

}

public int getStartPoint() {

return startPoint;

}

public int getEndPoint() {

return endPoint;

}

}

MAinActivity代码的实现:

package com.hh.imitationsinatopiceditview;

import android.graphics.Color;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.text.Editable;

import android.text.Spannable;

import android.text.SpannableStringBuilder;

import android.text.TextWatcher;

import android.text.style.ForegroundColorSpan;

import android.view.KeyEvent;

import android.view.View;

import com.hh.imitationsinatopiceditview.bean.EditTextLocationBean;

import com.hh.imitationsinatopiceditview.ui.ChildEditText;

import java.util.ArrayList;

import java.util.List;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class MainActivity extends AppCompatActivity {

private ChildEditText editText;

private List<EditTextLocationBean> list = new ArrayList<>();

private String rexgStr = ""; //匹配字符串

private boolean onchange = false;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findView();

setLister();

initData();

}

private void findView() {

editText = (ChildEditText) findViewById(R.id.editText);

}

private void setLister() {

editText.addTextChangedListener(new TextWatcher() {

@Override

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

if (!onchange){

list.clear();

}

}

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override

public void afterTextChanged(Editable s) {

if (!onchange){

onchange = true;

changeText();

}else{

onchange = false;

}

}

});

editText.setOnKeyListener(new View.OnKeyListener() {

@Override

public boolean onKey(View v, int keyCode, KeyEvent keyEvent) {

if (keyCode == KeyEvent.KEYCODE_DEL && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {

int indexS = editText.getSelectionStart();

int indexE = editText.getSelectionEnd();

//开始光标 等于 结束光标

if(indexE != 0 && indexS == indexE){

for(final EditTextLocationBean bean :list){

if(indexS == bean.getEndPoint()){

editText.clearFocus();

editText.setSelection(bean.getStartPoint(),bean.getEndPoint());

return true;

}

}

}

}

return false;

}

});

}

private void initData() {

String str = "#暴走大事件#";

rexgStr = "#暴走大事件#";

editText.setText(str);

editText.setSelection(editText.getText().toString().length());

// changeText();

}

//主要editText内容发生改变,都会调用这个方法

private void changeText() {

Pattern pattern = Pattern.compile(rexgStr);

int start = editText.getSelectionStart();

if (rexgStr != null && !rexgStr.equals("")){

String replaceStr = editText.getText().toString();

SpannableStringBuilder builder = new SpannableStringBuilder(replaceStr);

Matcher match = pattern.matcher(replaceStr);

int i=0;

while (match.find()){

i++;

builder.setSpan(new ForegroundColorSpan(Color.BLUE),match.start(),match.end(),

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

list.add(new EditTextLocationBean(match.start(),match.end()));

}

if (i > 0){

editText.setText(builder);

editText.setSelection(start);

editText.setList(list);

}else{

onchange = false;

}

}

}

}

到此该功能就OK了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: