2013-05-01 2 views
8

setOnFocusChangeListenerを使用してSQLiteDatabaseに保存するいくつかのEditTextフィールドがあります。私はonFocusChangeListenerを個別に設定する必要がありますか、またはある種のキャッチオールがありますか? (getActivity()。findViewByIDが、これはフラグメントであるため)すべてのEditTextのEditText setOnFocusChangeListener

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

ArrayListの<のEditTextを持っているいくつかの方法があるような...>のEditTextビューの、へのポインタを(どのように申し訳ありませんが、確かではない)を割り当てます既存のeditTextを編集し、onFocusChangeListenerをarraylist全体に設定しますか?または、ArrayListを繰り返し処理し、onFocusChangeListenerを各メンバーに設定しますか?

また、どのEditTextが実行されたかにかかわらず、すべてのデータをデータベースに保存するか、いずれかのonFocusChangeListenerイベントを検出する方法はありますか?

答えて

18
:次に、あなたのTextViewのインスタンスごとに、このメソッドを呼び出すことができます

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

:メソッドにこれを抽象化し、各TextViewのためにそれを呼び出すことについて、あなたのためにイベントを追加する方法1については、

あなたの活動にOnFocusChangeListenerを実装させることができます。そうすれば、すべての変更はその1つのメト、dになりますが、ビューIDをv.getId()にしてフォーカスを変更したビューを確認し、それに応じて処理する必要があります。

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

    ...etc 
    } 
} 
+0

これは実際に私が使用する方法です。ありがたいことに、フラグメントはOnFocusChangedListenerも実装できます!最終的に、コードが少なくなります。 –

+1

'OnFocusChange-d-Listener'ではなく' OnFocusChangeListener'ですか? (ハイフンは分かりやすくするために追加されています)明らかに大きな問題ではありませんが、まだ分かりませんでした。 – Kirk

+0

私はこれで苦労しています、setOnFocusChangeListenerは匿名の内部クラスが渡されます。 – k2ibegin

6

これを簡単にする方法はたくさんあります。

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

それを呼び出したビュー伝えるためにそれを使用することができ、パラメータビューを持っているので。試してみます。ありがとう! –

8

私の提案はあなたのためにこれを処理するためにカスタムEditTextを使用することです:

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

あなたは異なったクライアントとデータキーを処理することを決定するかもしれないが、アイデアは、カスタムを使用することです自動的にそれを処理する基本クラスです。

+1

うわー、私の賃金率以上。たぶん、そのほとんどが最終的に何かを理解するでしょう。私はちょうど新しい男です。 –

3

あるいは単純

OnFocusChangeListener listener; 

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

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

onFocusChange(ビューV、ブールhasFocus)は、これは面白いです

+0

他の回答に関連して、ありがとう! –

+0

あなたは歓迎ですJames :) – Ian

+0

これは動作しますが、コードにいくつかのタイプミスがあります。作業コードは次のようになります: 'OnFocusChangeListener listener; listener = new OnFocusChangeListener(){ パブリックvoid onFocusChange(ビューv、boolean hasFocus){ // Do something } } – Zerato