ListView 内的 EditText 不会保持焦点[重复]

Posted

技术标签:

【中文标题】ListView 内的 EditText 不会保持焦点[重复]【英文标题】:EditText inside ListView will not stay focused [duplicate] 【发布时间】:2012-09-25 16:28:39 【问题描述】:

ListView 的每一行内都有一个EditText。出于某种原因,当我点击 EditText 时,它会短暂获得焦点,但随后立即失去焦点。

我已经尝试过这些事情:

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

虽然EditText (简要地)聚焦,但Enter 键表示Next 并且auto-correct bar 存在。当它失去焦点时,软键盘保持向上,但Enter 键变为Return Arrowauto-correct bar 消失。

【问题讨论】:

我假设您忘记了视图是如何被回收的。建议:不要在列表项中使用editText。 为什么回收它们对焦点很重要? 因为很少有编辑文本可以交替用于绘制每一行,而且它们同时接收到各种焦点状态变化 我在<activity> 中使用android:windowSoftInputMode="adjustPan" 完成了这项工作。它的作用就像魅力一样。 【参考方案1】:

如果你想让列表项成为焦点,它非常简单: 使列表视图不具有焦点,并说它的焦点是afterDescendants,这让EditTexts 和其他可焦点项目获得焦点。

<ListView
    android:layout_
    android:layout_
    android:descendantFocusability="afterDescendants"
    android:focusable="false" />

【讨论】:

似乎不起作用 它对我有用...谢谢:) 感谢您的宝贵回答:) 是的也为我工作 它正在工作....谢谢 :)【参考方案2】:

ListViews 中的EditTexts 非常棘手。如果可能的话,我建议你像避免瘟疫一样避免它们。当我和他们打交道时,this answer 很有帮助。如果您只有几件物品,您可以随时使用ScrollView

【讨论】:

是的,在滚动视图中使用垂直线性布局就可以了。我注意到的一件事是,如果它是 ListActivity,ListView 中的 EditTexts 工作正常。但如果它是常规活动中的 ListView,则不会。 如果我们避开它们,替代品是什么? "你总是可以使用 ScrollView" 如何将 ScrollView 用于动态创建的视图?【参考方案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_
    android:layout_
    android:orientation="vertical" >

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

    <ScrollView
        android:id="@+id/svMain"
        android:layout_
        android:layout_ >

        <LinearLayout
            android:id="@+id/llForm"
            android:layout_
            android:layout_
            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());                
                
            
        
    

我希望它对某人有所帮助。

【讨论】:

以上是关于ListView 内的 EditText 不会保持焦点[重复]的主要内容,如果未能解决你的问题,请参考以下文章

EditText 不会显示在 ListView 上方

edittext向listview中传字符

listview中每个item都有一个edittext,怎么把用户输入edittext的值保存到数据库?

在安卓编程中,怎么在EditText中输入内容发表后在下面的ListView显示出来,如图所示

关于最下方 EditText 获取焦点 界面上移的问题

Android:自定义 ListView 不会立即填充