类似短信中添加人的layout

类似于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);
						}
					}
				}
			}
		});
	}

以上是部份的代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要动态添加 FragmentLayout,您需要执行以下步骤: 1. 在布局文件添加 FragmentLayout 占位符 您需要在布局文件添加一个 FragmentLayout,它将用作动态添加 Fragment 的容器。例如,您可以在布局文件添加以下代码: ``` <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 创建 Fragment 您需要创建要添加到 FragmentLayout 的 Fragment。例如,您可以创建一个名为 MyFragment 的 Fragment 类。 ``` public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_layout, container, false); // 在这里初始化 Fragment 的视图 return view; } } ``` 3. 动态添加 Fragment 您需要在 Activity 或 Fragment 动态添加 Fragment。在以下示例,我们将在 Activity 动态添加 Fragment: ``` FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); MyFragment myFragment = new MyFragment(); fragmentTransaction.add(R.id.fragment_container, myFragment); fragmentTransaction.commit(); ``` 在上面的代码,我们获取 FragmentManager 并开始 FragmentTransaction。然后,我们创建一个 MyFragment 实例,并使用 add() 方法将其添加到 FragmentLayout 。最后,我们提交 FragmentTransaction。 4. 显示 Fragment 当您添加 Fragment 时,它不会立即显示在屏幕上。您需要调用 FragmentTransaction 的 commit() 方法,以便将 Fragment 显示在屏幕上。 ``` fragmentTransaction.commit(); ``` 通过这些步骤,您可以动态添加 FragmentLayout
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值