终于自己写了一个。先上代码吧:
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;
}
}