2013-05-01 12 views
8

Mam kilka pól EditText, które chcę zapisać do SQLiteDatabase z setOnFocusChangeListener. Czy muszę ustawić onFocusChangeListener na każdym z osobna, czy też istnieje jakiś rodzaj catch-all? (GetActivity(). FindViewByID ponieważ jest to fragment)EditText setOnFocusChangeListener na wszystkich 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()); 
     } 
    } 
}); 

Jak ... Czy jest jakiś sposób, aby mieć ArrayList < EditText> z EditText Widoki przypisać wskaźnik (przepraszam, nie wiem jak) do istniejące editTexts i ustawić onFocusChangeListener na całą listę macierzy? Lub, nawet, iterować przez ArrayList i ustawić onFocusChangeListener dla każdego członka?

Albo sposób na wykrycie KAŻDYCH zdarzeń onFocusChangeListener i po prostu zapisanie wszystkich danych w bazie danych, niezależnie od tego, w jaki sposób EditText wystąpił w ogóle?

Odpowiedz

18

Cóż, możesz mieć swoją aktywność zaimplementować OnFocusChangeListener. W ten sposób wszystkie twoje zmiany będą dotyczyły tego jednego meto, d, ale będziesz musiał sprawdzić, który widok zmienił fokus, uzyskując identyfikator widoku z v.getId() i odpowiednio go obsłużyć.

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

    ...etc 
    } 
} 
+0

To jest właściwie metoda, której zamierzam użyć; i na szczęście fragmenty mogą również zaimplementować OnFocusChangedListener! Ostatecznie, mniej kodu. –

+1

Czy to nie 'OnFocusChangeListener' zamiast' OnFocusChange-d-Listener'? (Dodałem Hyphens dla jasności.) Oczywiście nie jest to wielka sprawa, ale zajęło mi to minutę. – Kirk

+0

Mam z tym problem, setOnFocusChangeListener jest przekazywana anonimowej klasy wewnętrznej, jak powinienem zmienić tę część, aby wszystko działało? – k2ibegin

6

Istnieje wiele sposobów, które można uprościć. Z jednej strony, jak o abstrahując to do metody i nazywając go dla każdego TextView chcesz dodać wydarzenie dla:

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

Następnie można wywołać tej metody dla każdego z przypadków TextView:

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

To jest ciekawe. Spróbuję. Dzięki! –

8

Moja sugestia byłoby użyć niestandardowego EditText obsłużyć to dla Ciebie:

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

może zdecydujesz się obsługiwać klucze klienta i danych w różny sposób, ale chodzi o to, że używasz niestandardowego klasa bazowa, która obsłuży go automatycznie.

+1

Wow, ponad moją stawkę wynagrodzenia. Może zrozumiem, co w końcu jest w większości. Jestem tylko nowym facetem. –

3

Albo jeszcze prościej

OnFocusChangeListener listener; 

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

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

Od onFocusChange (Zobacz v, logiczna hasFocus) ma parametr View można używać, aby stwierdzić, który nazwał go widok

+0

Powiązane z innymi odpowiedziami, dziękuję! –

+0

Serdecznie zapraszamy James :) – Ian

+0

To działa, ale w kodzie są pewne literówki. Kod roboczy byłby następujący: 'OnFocusChangeListener listener; detektor = nowy OnFocusChangeListener() { publiczny void onFocusChange (Zobacz v, boolean hasFocus) { // Zrób coś } }; '' – Zerato

Powiązane problemy