mirror of
https://github.com/HackPlan/Android-AutoCompleteEditText.git
synced 2026-01-13 07:00:58 +08:00
106 lines
3.1 KiB
Java
106 lines
3.1 KiB
Java
package im.dacer;
|
|
|
|
import android.content.Context;
|
|
import android.util.AttributeSet;
|
|
import android.view.WindowManager;
|
|
import android.widget.ArrayAdapter;
|
|
import android.widget.AutoCompleteTextView;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
/**
|
|
* Created by Dacer on 5/23/14.
|
|
* Show a drop-down list after input a symbol.
|
|
*/
|
|
public class AutoCompleteEditText extends AutoCompleteTextView {
|
|
|
|
private ArrayAdapter<String> adapter;
|
|
private String startAtSymbol = "#";
|
|
|
|
public AutoCompleteEditText(Context context){
|
|
this(context, null);
|
|
}
|
|
public AutoCompleteEditText(Context context, AttributeSet attrs){
|
|
super(context,attrs);
|
|
init();
|
|
}
|
|
public AutoCompleteEditText(Context context, AttributeSet attrs, int defStyle){
|
|
super(context, attrs, defStyle);
|
|
init();
|
|
}
|
|
|
|
private void init(){
|
|
adapter = new ArrayAdapter<String>(getContext(),
|
|
android.R.layout.simple_dropdown_item_1line, new ArrayList<String>());
|
|
setAdapter(adapter);
|
|
setDropDownWidth(WindowManager.LayoutParams.WRAP_CONTENT);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param symbol default is #
|
|
*/
|
|
public void setStartAtSymbol(String symbol){
|
|
startAtSymbol = symbol;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param dataList The data must start with the symbol
|
|
*/
|
|
public void setAutoCompleteList(String[] dataList){
|
|
adapter = new ArrayAdapter<String>(getContext(),
|
|
android.R.layout.simple_dropdown_item_1line, dataList);
|
|
setAdapter(adapter);
|
|
}
|
|
|
|
@Override
|
|
public boolean enoughToFilter() {
|
|
if(getText() != null){
|
|
return getText().length() != 0;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
protected void performFiltering(CharSequence text, int keyCode){
|
|
String beforeCursor = getText().toString().substring(0, getSelectionStart());
|
|
Pattern pattern = Pattern.compile(getRegularExpression());
|
|
Matcher matcher = pattern.matcher(beforeCursor);
|
|
if (matcher.find()) {
|
|
text = matcher.group(0);;
|
|
}
|
|
super.performFiltering(text, keyCode);
|
|
}
|
|
|
|
@Override
|
|
protected void replaceText(CharSequence text){
|
|
String beforeCursor = getText().toString().substring(0, getSelectionStart());
|
|
String afterCursor = getText().toString().substring(getSelectionStart());
|
|
|
|
Pattern pattern = Pattern.compile("#\\S*");
|
|
Matcher matcher = pattern.matcher(beforeCursor);
|
|
StringBuffer sb = new StringBuffer();
|
|
int matcherStart = 0;
|
|
while (matcher.find()) {
|
|
int curPos = getSelectionStart();
|
|
if(curPos > matcher.start() &&
|
|
curPos <= matcher.end()){
|
|
matcherStart = matcher.start();
|
|
matcher.appendReplacement(sb, text.toString()+" ");
|
|
}
|
|
}
|
|
matcher.appendTail(sb);
|
|
setText(sb.toString()+afterCursor);
|
|
setSelection(matcherStart + text.length()+1);
|
|
}
|
|
|
|
|
|
private String getRegularExpression(){
|
|
return startAtSymbol+"\\S*\\z";
|
|
}
|
|
}
|