2012-10-30 9 views
5

Ich habe eine Listenansicht, wobei jede Zeile ein EditText ist, mit etwas Text. Wenn ich auf eine Zeile tippe, erhält EditText den Fokus, zeigt den blinkenden Cursor und den Auswahlanker an (Sie kennen die blau/grauen Griffe, die Sie ziehen, um einen Textbereich auszuwählen).EditText Auswahl Anker

Das Problem ist, dass, wenn ich von einer Zeile zu einem anderen (Edittext zu einem anderen) verschiebe, ohne neuen Text zu unterhalten, der Auswahl Anker im vorherigen Editiertext für eine Weile sichtbar bleibt. Ich möchte diesen Anker sofort ausblenden, wenn der Editiertext keinen Fokus hat.

Irgendwelche Ideen?

ClearFocus Funktioniert nicht

 editText.setOnFocusChangeListener(new OnFocusChangeListener() {    
      public void onFocusChange(View v, boolean hasFocus) { 
       if(hasFocus) { 

       } else { 
        editText.clearFocus(); 
        //editText.clearComposingText();       
       } 
      } 
     }); 

Screenshot

The Problem

+0

Es ist seltsam, haben Sie es auf anderen Geräten getestet ?? – meh

+0

Ich habe nur ein Gerät :( – States

+0

Nun die einzige 'Lösung' versucht ClearFocus() auf allen anderen Zellen aufzurufen, wenn einer Ihrer Edittexte den Fokus erhält, oder vielleicht ist Ihr Adapter nicht richtig geschrieben. Versuchen Dieser Adapter stattdessen: http://thinkandroid.wordpress.com/2010/01/13/custom-baseadapters/ – meh

Antwort

2

ich es endlich! Zuallererst habe ich die Fokussierbarkeit von der ListView entfernt. Dann schrieb ich eine benutzerdefinierte OnFocusChangeListener, die die Auswahl aus der Ansicht entfernt, die den Fokus verliert. Dieser Listener wird von einem benutzerdefinierten Adapter auf die Ansichten angewendet (ich habe ArrayAdapter eingepackt, aber Sie können auch eine SimpleCursorAdapter umbrechen).

Beigefügt ist ein Demo (auf einem Emulator mit Eclair getestet):

public class ListOfEditViews extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ListView list = new ListView(this); 
     list.setAdapter(getAdapter()); 
     list.setFocusable(false); 
     list.setFocusableInTouchMode(false); 

     setContentView(list); 
    } 

    private ListAdapter getAdapter() { 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.edit_text, R.id.text) { 

      @Override 
      public View getView (int position, View convertView, ViewGroup parent) { 
       View view = super.getView(position, convertView, parent); 
       view.setFocusable(true); 
       view.setFocusableInTouchMode(true); 
       view.setOnFocusChangeListener(listener); 
       return view; 
      } 
     }; 

     String words = "Lorem ipsum dolor sit amen"; 

     for (String word: words.split(" ")) 
      adapter.add(word); 

     return adapter; 
    } 

    private OnFocusChangeListener listener = new OnFocusChangeListener() { 

     public void onFocusChange(View view, boolean hasFocus) { 
      view.dispatchWindowFocusChanged(hasFocus); 
     } 
    }; 
} 
+0

Probieren Sie es jetzt aus. Die von getView (..) zurückgegebene Ansicht ist ein EditText-Typ? – States

+0

hmm, funktioniert nicht :(Jetzt wird der Anker auf den Anfang des Edittext gesetzt, anstatt auf das Ende. Ich habe das Gefühl, es ist ein versionsspezifisches Problem. – States

+0

@States Siehe das Update: Ich habe 'view.dispatchWindowFocusChanged (hasFocus) 'im Zuhörer ... Das scheint mir wirklich ein Hack zu sein, funktioniert aber in meinen Tests – Raffaele