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 Arrow
,auto-correct bar
消失。
【问题讨论】:
我假设您忘记了视图是如何被回收的。建议:不要在列表项中使用editText。 为什么回收它们对焦点很重要? 因为很少有编辑文本可以交替用于绘制每一行,而且它们同时接收到各种焦点状态变化 我在<activity>
中使用android:windowSoftInputMode="adjustPan"
完成了这项工作。它的作用就像魅力一样。
【参考方案1】:
如果你想让列表项成为焦点,它非常简单:
使列表视图不具有焦点,并说它的焦点是afterDescendants
,这让EditText
s 和其他可焦点项目获得焦点。
<ListView
android:layout_
android:layout_
android:descendantFocusability="afterDescendants"
android:focusable="false" />
【讨论】:
似乎不起作用 它对我有用...谢谢:) 感谢您的宝贵回答:) 是的也为我工作 它正在工作....谢谢 :)【参考方案2】:ListView
s 中的EditText
s 非常棘手。如果可能的话,我建议你像避免瘟疫一样避免它们。当我和他们打交道时,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 不会保持焦点[重复]的主要内容,如果未能解决你的问题,请参考以下文章
listview中每个item都有一个edittext,怎么把用户输入edittext的值保存到数据库?