类似短信中添加人的layout

来源:互联网 发布:数据分析属于什么职能 编辑:程序博客网 时间:2024/06/07 23:54

类似于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() {@Overridepublic 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() {@Overridepublic 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);}}}}});}

以上是部份的代码。

0 0
原创粉丝点击