2013-05-01 9 views
8

Ich habe mehrere EditText-Felder, die ich mit setOnFocusChangeListener in der SQLiteDatabase speichern möchte. Muss ich einen onFocusChangeListener für jeden einzeln einstellen, oder gibt es einen Catch-all? (GetActivity(). FindViewById denn dies ist ein Fragment)EditText setOnFocusChangeListener für alle EditTexts

final TextView txtName = (TextView)getActivity().findViewById(R.id.clientHeader); 
final TextView txtCompany = (TextView)getActivity().findViewById(R.id.txtContactCompany);  
final TextView txtPosition = (TextView)getActivity().findViewById(R.id.txtContactPosition);  


txtName.setOnFocusChangeListener(new OnFocusChangeListener() {   
    public void onFocusChange(View v, boolean hasFocus) { 
     if(!hasFocus) { 
      saveThisItem(txtClientID.getText().toString(), "name", txtName.getText().toString()); 
     } 
    } 
}); 


txtCompany.setOnFocusChangeListener(new OnFocusChangeListener() {   
    public void onFocusChange(View v, boolean hasFocus) { 
     if(!hasFocus) { 
      saveThisItem(txtClientID.getText().toString(), "company", txtCompany.getText().toString()); 
     } 
    } 
}); 

txtPosition.setOnFocusChangeListener(new OnFocusChangeListener() {   
    public void onFocusChange(View v, boolean hasFocus) { 
     if(!hasFocus) { 
      saveThisItem(txtClientID.getText().toString(), "position", txtPosition.getText().toString()); 
     } 
    } 
}); 

Wie ... ist es eine Möglichkeit, eine Arraylist haben < EditText> von EditText Ansichten, weist einen Zeiger (sorry, nicht sicher, wie) an den existierende editTexts und setzen den onFocusChangeListener auf die ganze arraylist? Oder sogar, durchlaufen Sie die ArrayList und setzen Sie den onFocusChangeListener auf jedes Mitglied?

Oder eine Möglichkeit, alle ONFocusChangeListener-Ereignisse zu erkennen, und nur alle Daten in der Datenbank zu speichern, unabhängig davon, was für EditText sogar auf?

Antwort

18

Nun, Sie könnten Ihre Aktivität implementieren OnFocusChangeListener. Auf diese Weise werden alle Ihre Änderungen auf dieser einen Methode vorgenommen, aber Sie müssen überprüfen, welche Ansicht den Fokus geändert hat, indem Sie die Ansichts-ID mit v.getId() erhalten und entsprechend handhaben.

@Override 
public void onFocusChange(View v, boolean hasFocus) { 
    switch(v.getId()){ 
    case r.id.editText1: 
    break; 

    ...etc 
    } 
} 
+0

Das ist eigentlich die Methode, die ich verwenden werde; und glücklicherweise können Fragmente auch OnFocusChangedListener implementieren! Letztendlich weniger Code. –

+1

Ist es nicht OnFocusChangeListener anstelle von OnFocusChange-d-Listener? (Bindestriche hinzugefügt für die Klarheit.) Offensichtlich keine große Sache, aber es dauerte noch eine Minute, um herauszufinden. – Kirk

+0

Ich kämpfe mit diesem, SetOnFocusChangeListener ist eine anonyme innere Klasse übergeben, wie soll ich diesen Teil ändern, um die ganze Sache arbeiten zu lassen? – k2ibegin

6

Es gibt viele Möglichkeiten, wie Sie das einfacher machen können. Zum einen, wie etwa das in ein Verfahren zu abstrahieren und es für jeden TextView Sie den Aufruf der Event hinzufügen für:

private void setOnFocusChangeListener(TextView textView, String name){ 

    textView.setOnFocusChangeListener(new OnFocusChangeListener() {   
     public void onFocusChange(View v, boolean hasFocus) { 
      if(!hasFocus) { 
       saveThisItem(txtClientID.getText(), name, 
          textView.getText()); 
      } 
     } 
    }); 
} 

Dann können Sie diese Methode für jede Ihrer Textview-Instanzen nennen:

setOnFocusChangeListener(txtName, "name"); 
setOnFocusChangeListener(txtCompany, "company"); 
setOnFocusChangeListener(txtPosition, "position"); 
+0

Das ist interessant. Ich werde es versuchen. Vielen Dank! –

8

mein Vorschlag wäre eine benutzerdefinierte EditText zu benutzen, das für Sie zu handhaben:

public class SaveEditText extends EditText implements View.OnFocusChangeListener { 
    private String mDataKey; 
    private String mClient; 

    public SaveEditText (Context context) { 
     super(context); 
     setOnFocusChangeListener(this); 
    } 

    public SaveEditText (Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setOnFocusChangeListener(this); 
    } 

    public void setDataKey (String dataKey) { 
     mDataKey = dataKey; 
    } 

    public void setClient (String client) { 
     mClient = client; 
    } 

    @Override 
    public void onFocusChange (View v, boolean hasFocus) { 
     saveThisItem(mClient, mDataKey, getText().toString()); 
    } 
} 

Sie entscheiden, könnte die Client-und Datenschlüssel anders zu handhaben, aber die Idee ist, dass Sie eine benutzerdefinierte verwenden Basisklasse, die es automatisch behandelt.

+1

Wow, über meine Bezahlung. Vielleicht werde ich verstehen, was das meiste davon letztendlich ist. Ich bin nur ein neuer Typ. –

3

Oder noch einfacher

OnFocusChangeListener listener; 

listener = new new OnFocusChangeListener() {   
    public void onFocusChange(View v, boolean hasFocus) { 
...  } 
    } 
}); 

textbox1. setOnFocusChangeListener(listener); 
textbox2. setOnFocusChangeListener(listener); 
textbox3. setOnFocusChangeListener(listener); 

Seit onFocusChange (Blick v, boolean hasFocus) den Parameter View hat Sie verwenden, können zu sagen, welche Ansicht er genannt

+0

Im Zusammenhang mit den anderen Antworten, danke! –

+0

Gern geschehen James :) – Ian

+0

Das funktioniert, aber es gibt einige Tippfehler im Code. Arbeitscode wäre: OnFocusChangeListener listener; listener = new OnFocusChangeListener() { public void onFocusChange (Zeigen Sie v, boolean hasFocus) { // Tun Sie etwas } }; ' – Zerato

Verwandte Themen