类似短信中添加人的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
- 类似短信中添加人的layout
- Android入门-短信-layout中getX,getLeft等的区别
- QMainWindow中添加layout的问题
- Layout中添加tab标签
- 工作记录- layout中添加按钮的工作
- MFC单文档中添加类似OnCommand的Virtual函数
- 实现类似listView中动态添加Item的功能
- qstackedwidget 的page添加 layout
- 已有新建短信的情况下。文件管理中,使用短信分享图片,图片没有被添加进短信
- 一个类似MIUI中原生短信编辑功能
- 侧滑回退的layout(类似IOS侧滑回退到上一个activity)
- Fragment的布局中自定义Layout的onSizeChanged添加组件失败的问题
- Android布局中LayoutInflater的使用(利用代码添加xml形式的Layout布局)
- android layout中添加XML以及监听事件放置的位置
- Eclipse添加Layout没有在R中自动生成对应的项目
- Fragment布局中动态添加显示新的layout.xml文件
- 添加QDialog的Layout布局属性操作
- Android 实现任务栏出现类似短信的提示功能
- json 对象转字符串 互转
- TrueCrypt——文件加密的法宝
- 苟富贵倒萨忽然他确实
- 字符串处理函数整理
- 如何避免表单重复提交
- 类似短信中添加人的layout
- sql 表之间 导出导入数据
- socket中TCP的三次握手建立连接详解
- c#数据的序列化和反序列化(推荐版)
- QTP10-插件破解脚本
- Win7(64) + eclipse(64)+ tomcat7(64)+ jdk7(64)开发环境配置
- js跳转页面方法
- JSP内置九大对象
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa