笔记98--自定义控件示例1:仿小米添加联系人(动态改变行数)

本文介绍了如何创建一个自定义控件,模仿小米添加联系人的功能,实现动态改变行数的效果。详细展示了关键代码和XML布局。
摘要由CSDN通过智能技术生成

终于自己写了一个。先上代码吧:

getParent()和实现逻辑

xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/et"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:numeric="integer"
            android:text=""
            android:width="320px" />

        <ImageButton
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:background="@drawable/asd" />
    </LinearLayout>

</LinearLayout>

java代码:

public class AddContact extends LinearLayout {

	/*
	 * 存放所有子项
	 */
	private List<View> list = new ArrayList<View>();
	/*
	 * 要显示的控件
	 */
	private LinearLayout layout;

	/*
	 * 保存上一次数据为空的edittext。当edittext数据变为空时使用。
	 */
	private EditText et;

	/*
	 * 最后一行是否可被删除。添加一行时设为false,删除最后一行时设为true。
	 */
	private boolean isLast = true;

	public AddContact(Context context) {
		super(context);
	}

	public AddContact(Context context, AttributeSet attrs) {
		super(context, attrs);

		isLast = true;

		layout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.addcontact, null);
		EditText et = (EditText) layout.findViewById(R.id.et);
		ImageButton btn = (ImageButton) layout.findViewById(R.id.btn);

		et.addTextChangedListener(new MyTextChange(et));
		btn.setOnClickListener(new MyClick(et));

		list.add(layout);
		addView(layout);
	}

	/*
	 * 删除最后一行,当最后一行数据不为空,则删除为空的一行。
	 */
	private void removeLastControls(EditText view) {
		if(list.size()<=1){
			return;
		}

		if(isLast){
			layout.removeView(list.get(list.size()-1));
			list.remove(list.size()-1);
			isLast =false;
		}else{
			LinearLayout ll = (LinearLayout) et.getParent().getParent();
			ll.removeView((View) et.getParent());
			list.remove((View) et.getParent());
		}

		et = view;
	}

	/*
	 * list大于1就可删除。如果当前行的EditText为空,则不能删除。
	 */
	private class MyClick implements OnClickListener{

		private EditText et;

		public MyClick(EditText et){
			this.et = et;
		}

		@Override
		public void onClick(View v) {

			if(list.size()>1){

				if(!et.getText().toString().trim().equals("")){
					layout.removeView((View) et.getParent());
					list.remove((View) et.getParent());
				}
			}
		}
	}

	private class MyTextChange implements TextWatcher{

		/*
		 * 是否是第一次输入。
		 */
		private boolean bTrue=true;
		private EditText et;

		public MyTextChange(EditText et){
			this.et = et;
		}

		@Override
		public void beforeTextChanged(CharSequence s, int start, int count,
				int after) {
		}

		@Override
		public void onTextChanged(CharSequence s, int start, int before,
				int count) {
		}

		/*
		 * 1、第一次输入,则在list末尾加一行
		 * 2、如果本行数据变为空,且本行非最后一行,则删除最后一行。
		 * 3、当数据变再次变为空,则将bTrue设为true,使其可增加一行。
		 */
		@Override
		public void afterTextChanged(Editable s) {

			if(bTrue)
				addControl();

			bTrue = false;

			if(s.toString().trim().equals("")){
				removeLastControls(et);
				bTrue = true;
			}
		}
	}

	/*
	 * 增加一行,设置最后一行可被删除。
	 */
	public void addControl() {

		if(list.size()!=0){
			isLast = true;
			View v = getNewRow();
			layout.addView(v);
			list.add(v);
		}
	}

	/*
	 * 增加的行
	 */
	private View getNewRow() {
		LinearLayout view = new LinearLayout(getContext());
		LinearLayout.LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
		view.setLayoutParams(params);
		view.setGravity(Gravity.CENTER);
		view.setOrientation(HORIZONTAL);

		LinearLayout.LayoutParams params1 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		EditText et = new EditText(getContext());
		et.setLayoutParams(params1);
		et.setWidth(320);
		et.addTextChangedListener(new MyTextChange(et));

		view.addView(et);

		ImageButton btn = new ImageButton(getContext());
		btn.setLayoutParams(params1);
		btn.setBackgroundResource(R.drawable.asd);
		btn.setOnClickListener(new MyClick(et));

		view.addView(btn);

		return view;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值