我写了一个类来动态显示EditTexts,因为你需要它们。因此,在接口需要可变数量的字符串输入的任何情况下,类都会生成所需的EditTexts。它通过始终提供额外的空白EditText来实现此目的。它还会删除那些未使用的内容。任何失去焦点的editText都会被销毁,除非它是最后剩下的EditText。
除了留下空白的EditText并使其失去焦点这一事实之外,它的效果非常好,但它也将焦点设置为页面上的第一个EditText(这不是动态它的一部分)页面的XML)以及我点击的其他任何字段。所以我有两个游标,不能再编辑页面上的第一个字段。
我认为发生的事情是当EditText失去焦点并被销毁时,android正在将焦点设置为页面上的默认字段,然后当下一个字段获得焦点时也会获得光标。这与删除我相信的EditText有关。
我真的很喜欢这个功能,所以我想让它运转起来。这是我班级的代码:
package com.bentles.attempt3;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.widget.EditText;
public class SmartEditTexts {
List<EditText> boxes = new ArrayList<EditText>();
Context context;
ViewGroup parent;
int index;
public SmartEditTexts(Context context, ViewGroup parent, int index)
{
this.context = context;
this.parent = parent;
this.index = index + 1;
add();
}
private void add()
{
EditText newEdit = new EditText(context);
newEdit.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
EditText changed= (EditText)v;
if (hasFocus)
{
if (boxes.indexOf(changed) == (boxes.size() - 1))
{
add();
}
}
else if (changed.getText().toString().trim().isEmpty()) //if there's nothing in the box
{
remove(changed); //try to get rid of the box
}
}
});
boxes.add(newEdit);
parent.addView(newEdit, index + boxes.indexOf(newEdit));
}
private void remove(EditText remover)
{
if (boxes.size() > 1)
{
boxes.remove(remover);
parent.removeView(remover);
}
}
public List<String> toStrings()
{
List<String> strings = new ArrayList<String>();
for(EditText a: boxes)
{
if (!a.getText().toString().trim().isEmpty())
strings.add(a.getText().toString().trim());
}
return strings;
}
}