Java removeView导致多个EditText具有焦点
我编写了一个类来根据需要动态显示编辑文本。因此,在任何情况下,当接口需要为字符串提供可变数量的输入时,类都会生成所需的EditText。它通过始终提供一个额外的空白编辑文本来实现这一点。它还将删除那些未使用的。任何失去焦点的空白editText都将被销毁,除非它是最后一个剩余的editText 它工作得非常好,除了留下一个空白的EditText并使其失去焦点会将其删除,但也会将焦点设置为页面上的第一个EditText(它不是动态的,它是页面XML的一部分)以及我单击的任何其他字段。因此,我有两个游标,无法再编辑页面上的第一个字段 我认为,当EditText失去焦点并被破坏时,android会将焦点设置为页面上的默认字段,然后当下一个字段获得焦点时,也会得到一个光标。我相信这与删除编辑文本有关 我真的很喜欢这个功能,所以我想让它工作。以下是我的课程代码:Java removeView导致多个EditText具有焦点,java,android,Java,Android,我编写了一个类来根据需要动态显示编辑文本。因此,在任何情况下,当接口需要为字符串提供可变数量的输入时,类都会生成所需的EditText。它通过始终提供一个额外的空白编辑文本来实现这一点。它还将删除那些未使用的。任何失去焦点的空白editText都将被销毁,除非它是最后一个剩余的editText 它工作得非常好,除了留下一个空白的EditText并使其失去焦点会将其删除,但也会将焦点设置为页面上的第一个EditText(它不是动态的,它是页面XML的一部分)以及我单击的任何其他字段。因此,我有两个
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;
}
}
package com.bentles.attempt3;
导入java.util.ArrayList;
导入java.util.List;
导入android.content.Context;
导入android.view.view;
导入android.view.view.OnFocusChangeListener;
导入android.view.ViewGroup;
导入android.widget.EditText;
公共类智能文本{
列表框=新的ArrayList();
语境;
视图组父对象;
整数指数;
公共文本(上下文、视图组父级、int索引)
{
this.context=上下文;
this.parent=parent;
该指数=指数+1;
添加();
}
私有void add()
{
EditText newEdit=新的EditText(上下文);
setOnFocusChangeListener(新的OnFocusChangeListener(){
@凌驾
public void onFocusChange(视图v,布尔hasFocus){
EditText changed=(EditText)v;
如果(hasFocus)
{
if(box.indexOf(已更改)=(box.size()-1))
{
添加();
}
}
else if(changed.getText().toString().trim().isEmpty())//如果框中没有任何内容
{
移除(更改);//试着摆脱这个盒子
}
}
});
框。添加(新建编辑);
parent.addView(newEdit,index+box.indexOf(newEdit));
}
私有无效删除(EditText删除程序)
{
如果(box.size()>1)
{
拆下(拆卸器);
parent.removeView(移除器);
}
}
公共列表toStrings()
{
列表字符串=新的ArrayList();
用于(编辑文本a:框)
{
如果(!a.getText().toString().trim().isEmpty())
添加(a.getText().toString().trim());
}
返回字符串;
}
}
我想您可以在remove上使用setrequestfocus false,我不确定我是否理解您的意思。我可以调用remover.requestFocus()或remover.isFocusable(false),但两者似乎都不起作用。还有其他方法我应该调用吗?我该把它叫哪里?