1。单击控件选中状态,弹出软键盘
2。再次单击,取消选中状态,收起软键盘
3 。单击软键盘中del键,删除选中的控件
代码:
package com.hysec.hami.widget;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.sinosoft.test.R;
public class ReceipientsView extends LinearLayout {
private List<TextView> mReceipientsViews;
private Context mContext;
private static final int PADDING = 5;
private static final int FONT_SIZE = 14;
private static final int MARGIN = 5;
private int mCurRowWidth;
private int mWidth;
private LinearLayout mCurRow;
private Paint mPaint;
private int mCurWidth;
private boolean isFir = true;
private View selectedView;
private EditText edittext;
private List<String> receipentNames;
public void setmWidth(int width) {
this.mWidth = width;
}
public int getmWidth() {
return this.mWidth;
}
public ReceipientsView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ReceipientsView(Context context) {
super(context);
init(context);
}
private void init(Context context) {
this.mContext = context;
receipentNames = new ArrayList<String>();
setOrientation(VERTICAL);
// 在oncreate时取不到父容器的宽度,这个回调可以得到其父容器的宽度
ViewTreeObserver observer = getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if(mWidth == 0) {
mWidth = getMeasuredWidth();
int count = receipentNames.size();
for(int i = 0;i < count;++i) {
addReceipent(receipentNames.get(i));
}
}
}
});
edittext = new EditText(context);
edittext.setBackgroundColor(Color.TRANSPARENT);
edittext.setCursorVisible(false);
// 这个要保证其有焦点,requestFocuse()请求焦点
edittext.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
if (selectedView != null) {
mReceipientsViews.remove(selectedView);
((LinearLayout)selectedView.getParent()).removeView(selectedView);
selectedView = null;
}
}
return false;
}
});
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(1,1);
addView(edittext,params);
setGravity(Gravity.FILL);
setBackgroundColor(Color.TRANSPARENT);
setPadding(PADDING, PADDING, PADDING, PADDING);
mReceipientsViews = new ArrayList<TextView>();
}
public void addName(String receipentName) {
if(!receipentNames.contains(receipentName))
receipentNames.add(receipentName);
}
private void addReceipent(String receipentName) {
// 满行
if (isNextLine(receipentName)) {
mCurRowWidth = 0;
isFir = false;
mCurRow = new LinearLayout(mContext);
mCurRow.setOrientation(HORIZONTAL);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.topMargin = MARGIN;
addView(mCurRow, params);
}
TextView receipent = new TextView(mContext);
receipent.setPadding(PADDING, PADDING, PADDING, PADDING);
receipent.setBackgroundDrawable(mContext.getResources().getDrawable(
R.drawable.unselreceipent));
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.leftMargin = MARGIN;
receipent.setTextSize(FONT_SIZE);
receipent.setText(receipentName);
mCurRowWidth += mCurWidth;
receipent.setOnClickListener(onClickListener);
mCurRow.addView(receipent, params);
mReceipientsViews.add(receipent);
}
private boolean isNextLine(String receipientName) {
mPaint = new Paint();
mPaint.setTextSize(FONT_SIZE);
mCurWidth = (int) mPaint.measureText(receipientName) + 2 * PADDING
+ MARGIN;
if (isFir)
return true;
return (mCurWidth + mCurRowWidth) > mWidth ? true : false;
}
private OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
InputMethodManager imm = (InputMethodManager) mContext
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (v == selectedView) {
v.setBackgroundDrawable(getResources().getDrawable(
R.drawable.unselreceipent));
selectedView = null;
// 这个是隐藏软键盘,不是切换(网上有些用imm.toggleSoftInput(showFlags, hideFlags),只是切换键盘的状态,不是单纯隐藏的效果)
imm.hideSoftInputFromWindow(getApplicationWindowToken(),0);
} else {
if(selectedView != null) {
selectedView.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.unselreceipent));
}
selectedView = v;
v.setBackgroundDrawable(getResources().getDrawable(
R.drawable.selreceipent));
edittext.requestFocus();
// 只是进是显示键盘,不是切换
imm.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
}
}
};
}