Java removeView导致多个EditText具有焦点

Java removeView导致多个EditText具有焦点,java,android,Java,Android,我编写了一个类来根据需要动态显示编辑文本。因此,在任何情况下,当接口需要为字符串提供可变数量的输入时,类都会生成所需的EditText。它通过始终提供一个额外的空白编辑文本来实现这一点。它还将删除那些未使用的。任何失去焦点的空白editText都将被销毁,除非它是最后一个剩余的editText 它工作得非常好,除了留下一个空白的EditText并使其失去焦点会将其删除,但也会将焦点设置为页面上的第一个EditText(它不是动态的,它是页面XML的一部分)以及我单击的任何其他字段。因此,我有两个

我编写了一个类来根据需要动态显示编辑文本。因此,在任何情况下,当接口需要为字符串提供可变数量的输入时,类都会生成所需的EditText。它通过始终提供一个额外的空白编辑文本来实现这一点。它还将删除那些未使用的。任何失去焦点的空白editText都将被销毁,除非它是最后一个剩余的editText

它工作得非常好,除了留下一个空白的EditText并使其失去焦点会将其删除,但也会将焦点设置为页面上的第一个EditText(它不是动态的,它是页面XML的一部分)以及我单击的任何其他字段。因此,我有两个游标,无法再编辑页面上的第一个字段

我认为,当EditText失去焦点并被破坏时,android会将焦点设置为页面上的默认字段,然后当下一个字段获得焦点时,也会得到一个光标。我相信这与删除编辑文本有关

我真的很喜欢这个功能,所以我想让它工作。以下是我的课程代码:

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),但两者似乎都不起作用。还有其他方法我应该调用吗?我该把它叫哪里?