2012-10-04 28 views
23

我有一個EditText一個ListView的每一行內。出於某種原因,當我點擊EditText時,它會短暫地獲得焦點,但會立即丟失焦點。EditText上不會保持專注

我嘗試了這些東西:

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


雖然EditText是(簡述)突出重點,在Enter鍵說Nextauto-correct bar存在。當失去焦點時,軟鍵盤保持不變,但Enter鍵變爲Return Arrow,並且auto-correct bar消失。內ListView小號

+0

我想你忘記了看法如何回收。建議:不要在列表項中使用editText。 – njzk2

+1

爲什麼回收它們重點是重要的? – Matt

+2

因爲有交替用於繪製每一行很少的EditText,他們正在接受所有類型的焦點狀態變化的同時 – njzk2

回答

8

EditText s爲非常棘手。如果可能的話,我建議你儘量避免使用鼠標。當我搞亂他們時,this answer雖然有幫助。如果你只有幾件物品,你可以隨時使用ScrollView

+0

是的,在scrollview中使用一個垂直的linearlayout做了訣竅。我注意到的一件事是,如果它是一個ListActivity,ListView中的EditTexts工作正常。但是,如果它是常規活動中的ListView,則不是。 – Matt

+1

如果我們避免它們,那麼替換是什麼? –

+0

「你總是可以使用滾動型」 – dmon

0

我知道這個問題很舊,但我今天也在爲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> 

的 「containter」 類:

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());     
       } 
      } 
     } 
    } 

我希望它可以幫助別人。

42

如果您想列表項採取集中,它非常直截了當: 讓列表視圖不可作爲焦點,並說,它的重點是afterDescendants這讓EditText S和其他可聚焦項目獲得焦點。

<ListView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:descendantFocusability="afterDescendants" 
    android:focusable="false" /> 
+2

似乎並不奏效 –

+1

它爲我...謝謝:) –

+0

感謝您的寶貴答案:) – Subho