removeView导致多个EditTexts具有焦点

时间:2014-08-13 10:15:55

标签: java android

我写了一个类来动态显示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;
}
}

0 个答案:

没有答案