ListView中的EditText无法保持焦点

29

我在 ListView 的每一行中都有一个 EditText。但是当我点击这个 EditText 时,它会短暂地获得焦点,然后立即失去焦点。

我尝试过以下操作:

listView.setItemsCanFocus(true);
editText.setFocusable(true);


EditText得到(短暂的)焦点时,Enter键变为Next,并显示自动校正条。 当失去焦点时,软键盘仍然保持弹出状态,但Enter键变为Return Arrow自动校正条消失。


我猜你忘记了视图是如何被回收的。建议:不要在列表项中使用editText。 - njzk2
1
为什么对于专注来说回收它们很重要? - Matt
2
因为有很少的EditText被用于交替绘制每一行,它们同时接收到各种焦点状态的改变。 - njzk2
1
我使用android:windowSoftInputMode="adjustPan"<activity>中完成了这个。它的效果非常好。 - Kasim Rangwala
3个回答

48
如果你想让列表项获取焦点,方法非常简单: 将列表视图设置为不可聚焦,并声明其焦点为afterDescendants,这样EditText和其他可聚焦的项就可以获得焦点了。
<ListView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="afterDescendants"
    android:focusable="false" />

3
似乎没有起作用。 - SpaceMonkey
3
这对我有用...谢谢 :) - karthik kolanji
2
感谢您宝贵的回答 :) - Subho
2
是的,对我也有效。 - Ranjithkumar
1
它正在工作中....谢谢 :) - bluetoothfx
有时候可行,但并非所有情况都适用。因此,在某些情况下(不使用android:descendantFocusability)以下方法可能更好:在activity中: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);或者在AndroidManifest.xml文件的activity部分: android:windowSoftInputMode="adjustPan" - Miki

10

ListView中的EditText非常棘手。如果可能的话,我建议你尽量避免使用它们。当我在处理这些时,这个答案还是很有帮助的。如果只有几个项目,您始终可以使用ScrollView


是的,使用ScrollView内部的垂直LinearLayout就解决了问题。我注意到的一件事是,如果它是ListActivity,ListView中的EditText正常工作。但如果它是常规活动中的ListView,则不起作用。 - Matt
1
如果我们避免它们,那么替代方案是什么? - user2836797
你可以随时使用ScrollView。 - dmon
1
如何在动态创建的视图中使用ScrollView? - Zafer

3

我知道这个问题很旧了,但今天我也在处理EditText和ListView。我认为浪费时间处理焦点问题或更新数据集已经是最后的选择了。

因此,我创建了一个Activity并动态添加所需的控件。在这个例子中,我添加了两个控件:一个TextView和EditText。

首先,我创建一个类作为控件的“容器”,然后将控件放在ScrollView中。

布局文件layout.xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/llMain"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tvHeader"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <ScrollView
        android:id="@+id/svMain"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:id="@+id/llForm"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >

        </LinearLayout>
    </ScrollView>

</LinearLayout>

“容器”类:
import android.widget.EditText;

public class RespostasArray {

    private int pergunta;
    private int formulario;
    private int form_coord;
    private int coordenada;
    private int form_resposta;
    private String questao;
    private String resposta;
    private EditText respostaEdit;

    public RespostasArray() {
        respostaEdit = null;
    }

    public int getPergunta() {
        return pergunta;
    }

    public void setPergunta(int pergunta) {
        this.pergunta = pergunta;
    }

    public int getFormulario() {
        return formulario;
    }

    public void setFormulario(int formulario) {
        this.formulario = formulario;
    }

    public int getForm_coord() {
        return form_coord;
    }

    public void setForm_coord(int form_coord) {
        this.form_coord = form_coord;
    }

    public int getCoordenada() {
        return coordenada;
    }

    public void setCoordenada(int coordenada) {
        this.coordenada = coordenada;
    }

    public int getForm_resposta() {
        return form_resposta;
    }

    public void setForm_resposta(int form_resposta) {
        this.form_resposta = form_resposta;
    }

    public String getQuestao() {
        return questao;
    }

    public void setQuestao(String questao) {
        this.questao = questao;
    }

    public String getResposta() {
        return resposta;
    }

    public void setResposta(String resposta) {
        this.resposta = resposta;
    }

    public EditText getRespostaEdit() {
        return respostaEdit;
    }

    public void setRespostaEdit(EditText respostaEdit) {
        this.respostaEdit = respostaEdit;
    }

}

因此,主要活动:

    import java.util.ArrayList;
    import java.util.List;

    import jv.android.getpoint.R;
    import jv.android.getpointlib.data.Formularios;
    import jv.android.getpointlib.data.GetPointDataHelper;
    import jv.android.getpointlib.data.Respostas;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.WindowManager.LayoutParams;
    import android.widget.EditText;
    import android.widget.LinearLayout;
    import android.widget.TextView;

    public class RespostasActivity extends Activity {

        private Intent intent;
        private ArrayList<RespostasArray> listItems = null;
        private GetPointDataHelper db = null;
        private int coordenada = -1;
        private int formulario = -1;
        private LinearLayout llRespostas;
        private TextView tvRespostasHeader;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.layout.xml);

            llRespostas = (LinearLayout)findViewById(R.id.llRespostas);
            tvHeader = (TextView)findViewById(R.id.tvHeader);

            listItems = new ArrayList<RespostasArray>();
            db = new GetPointDataHelper(this, false);

            intent = getIntent();

            if (intent != null)
            {
                Bundle params = intent.getExtras();

                if (params != null) {
                    coordenada = params.getInt("coordenada");
                    formulario = params.getInt("formulario");

                    tvHeader.setText("Some header");

// Load the fields I need from SQLite. Change it to your needs.
                    List<Respostas> respostas = db.selectAllRespostaDaCoordenada (coordenada, formulario);

                    if (respostas != null && respostas.size() > 0) {
                        for (int i = 0; i < respostas.size(); i++) {
                            TextView tv = new TextView(getApplicationContext());
                            tv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
                            tv.setText(respostas.get(i).getQuestao().trim() + (respostas.get(i).getQuestao().trim().endsWith(":") ? "" : ":"));
                            llRespostas.addView(tv);

                            EditText et = new EditText(getApplicationContext());
                            et.setText(respostas.get(i).getResposta().trim());
                            et.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));                      
                            llRespostas.addView(et);

                            RespostasArray ra = new RespostasArray();
                            ra.setCoordenada(respostas.get(i).getCoordenada());
                            ra.setForm_coord(respostas.get(i).getForm_coord());
                            ra.setForm_resposta(respostas.get(i).getForm_resposta());
                            ra.setFormulario(respostas.get(i).getFormulario());
                            ra.setPergunta(respostas.get(i).getPergunta());
                            ra.setQuestao(respostas.get(i).getQuestao());
                            ra.setResposta(respostas.get(i).getResposta());
                            ra.setRespostaEdit(et);                     

                            listItems.add(ra);                      
                        }
                    }
                }
            }               
        }

        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {    
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                doProcessResult();          
            }    

            return super.onKeyDown(keyCode, event);
        }

        private void doProcessResult() {
            for (int i = 0; i < listItems.size(); i++) {
                if (listItems.get(i).getForm_resposta() == 0) {
                    db.insertResposta(listItems.get(i).getFormulario(), listItems.get(i).getForm_coord(), listItems.get(i).getPergunta(), listItems.get(i).getRespostaEdit().getText().toString());
                } else {
                    db.updateResposta(listItems.get(i).getForm_resposta(), listItems.get(i).getRespostaEdit().getText().toString());                
                }
            }
        }
    }

希望这能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接