类似于android短信中添加人,显示在layout中,同时可以自写号码添加显示出来。
1,自写一个viewgroup,重写onmeasure和onlayout方法
(1)onMeasure方法主要是遍历viewgroup中 的子view,然后依次的measure子view的height和width
(2)onLayout方法主要是根据子view的width和height设置每个子view的位置
2,每选择一个人时就新建一个textview添加到viewgroup中,viewgroup的最后添加一个editText,同时重新绘制view
3,对edittext设置监听事件,当点击键盘上的返回键时则将editText中输入的内容生成一个textView组件添加到viewgroup中
4,当点击Textview时可以删除view。
效果图如下:
重写viewgroup类,代码如下:
package ims_efetion.smsmms.floatlayout;
import ims_efetion.utils.Tools;
import com.xinmei.EUT.R;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.text.InputType;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
public class MyAutoLayout extends ViewGroup{
private final static String TAG = "MyViewGroup";
private final static int VIEW_MARGIN=5;
private int start ;
private int end ;
private EditText et ;
public MyAutoLayout(Context context) {
super(context);
}
public MyAutoLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyAutoLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Log.d(TAG, "widthMeasureSpec = "+widthMeasureSpec+" heightMeasureSpec"+heightMeasureSpec);
for (int index = 0; index < getChildCount(); index++) {
final View child = getChildAt(index);
// measure
child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
// Log.d(TAG, "changed = "+arg0+" left = "+arg1+" top = "+arg2+" right = "+arg3+" botom = "+arg4);
final int count = getChildCount();
int row=0;// which row lay you view relative to parent
int lengthX=arg1; // right position of child relative to parent
int lengthY=arg2; // bottom position of child relative to parent
int firstHeight = 0;
for(int i=0;i<count;i++){
final View child = this.getChildAt(i);
int width = child.getMeasuredWidth();
int height = child.getMeasuredHeight();
lengthX+=width+VIEW_MARGIN;
lengthY=row*(height+VIEW_MARGIN)+VIEW_MARGIN+height+arg2;
if(i==0) {
firstHeight = height ;
}
//if it can't drawing on a same line , skip to next line
if(lengthX>arg3){
lengthX=width+VIEW_MARGIN+arg1;
row++;
lengthY=row*(height+VIEW_MARGIN)+VIEW_MARGIN+height+arg2;
}
if(i == 0 ) {
start = lengthY-height;
}
if(i== (getChildCount() - 1) ) {
if(count == 2){
firstHeight = height;
}
lengthY = row*(firstHeight+VIEW_MARGIN)+VIEW_MARGIN+firstHeight+arg2;
end = lengthY ;
if(count == 2){
et.setHeight(firstHeight);
et.layout(etLeft, lengthY-height, arg3-width-3, lengthY);
} else {
if(etBottom < lengthY){
//Log.i(TAG, "not on the same row");
//不在同一行
et.layout(etLeft, lengthY-height*2-VIEW_MARGIN, arg3-3, lengthY-VIEW_MARGIN-height);
} else {
//Log.i(TAG, "on the same row");
//在同一行
et.setHeight(firstHeight);
et.layout(etLeft, lengthY-height, arg3-width-3, lengthY);
}
}
child.layout(arg3-width, lengthY-height, arg3-3, lengthY);
} else {
child.layout(lengthX-width, lengthY-height, lengthX, lengthY);
if(i== (getChildCount() - 2)){
etLeft = lengthX-width ;
etTop = lengthY-height ;
etRight = lengthX ;
etBottom = lengthY ;
}
}
if(i== (getChildCount() - 2)){
et = (EditText) child;
et.setTextSize(12);
et.setTextColor(Color.BLACK);
et.setPadding(padLeft, padTop, padRight, padBottom);
et.setBackgroundColor(0x00E2E6E7);
if(count <= 2){
et.setHint(R.string.sms_receiver);
et.setTextColor(Color.BLACK);
} else {
et.setHint("");
}
}
//child.layout(lengthX-width, lengthY-height, lengthX, lengthY);
}
}
int etLeft = 0 ;
int etRight = 0 ;
int etTop = 0 ;
int etBottom = 0 ;
int padLeft = 0 ;
int padRight = 0 ;
int padTop = 0 ;
int padBottom = 0 ;
private Activity activity ;
/**获取到ViewGroup中所有子控件累积的高度*/
public int getActualHeight() {
return Math.abs(start-end);
}
public void setActivity(Activity activity){
this.activity = activity ;
padLeft = Tools.dip2px(activity, 3);
padRight = Tools.dip2px(activity, 3);
padTop = Tools.dip2px(activity, 7);
padBottom = Tools.dip2px(activity, 7);
}
}
选择人后,向viewgroup中重新添加TextView,同时viewGroup最后添加一个EditText,用来支持自写的,此时editText是没有获取焦点的,代码如下:
private void setGvAndRlVisible(boolean isRequestFocus) {
if(et != null ){
et.setOnFocusChangeListener(null);
}
al_contacts.removeAllViews();
rl_addcontacts.setVisibility(View.GONE);
al_contacts.setVisibility(View.VISIBLE);
for(int i = 0 ; i<contact_pairs.size() ; i++) {
view_pair view_pair = contact_pairs.get(i);
TextView tv_name = getTextView(view_pair.m_name,view_pair);
al_contacts.addView(tv_name);
}
et = new EditText(this);
if(isRequestFocus){
et.requestFocus();
}
setKeyListener(et);
al_contacts.addView(et);
ImageView iv_add = new ImageView(this);
setImageViewClickListener(iv_add);
iv_add.setImageResource(R.drawable.smsmms_add_contacts);
al_contacts.addView(iv_add);
}
EditText设置监听事件,代码如下:
/**
* 设置输入框的按键监听
* @param et2
*/
private void setKeyListener(final EditText et2) {
et2.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
String reciverStr = et2.getText().toString();
if(keyCode == KeyEvent.KEYCODE_ENTER){
if(!TextUtils.isEmpty(reciverStr)){
if(reciverStr.matches("^\\d+$")){
view_pair pair = new view_pair();
pair.m_name = reciverStr;
pair.setSipID(reciverStr);
pair.telArray.add(reciverStr);
contact_pairs.add(pair);
et2.setOnFocusChangeListener(null);
setGvAndRlVisible(true);
} else {
Tools.showToast(getApplicationContext(),R.string.number_error);
}
return true ;
}
//et2.clearFocus();
}
// if(keyCode == KeyEvent.KEYCODE_DEL){
// if(TextUtils.isEmpty(reciverStr) && contact_pairs.size() > 0){
// contact_pairs.remove(contact_pairs.size() - 1);
// setGvAndRlVisible();
// return true ;
// }
// }
return false;
}
});
et2.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
String reciverStr = et2.getText().toString();
if(!hasFocus){
if(!TextUtils.isEmpty(reciverStr)){
if(reciverStr.matches("^\\d+$")){
view_pair pair = new view_pair();
pair.m_name = reciverStr;
pair.setSipID(reciverStr);
pair.telArray.add(reciverStr);
contact_pairs.add(pair);
setGvAndRlVisible(false);
} else {
Tools.showToast(getApplicationContext(),R.string.number_error);
}
}
}
}
});
}
以上是部份的代码。