2016-10-20 4 views
-1

数字を入力するときにフィールドが更新されるウェイトのコンバーターを作成するための宿題があります(「計算する」などは必要ありません)。生徒の一人が以下のコードを提供しました。 コードが動作します。フィールド1に数値を入力すると、入力中にフィールド2が変更されます。setOnKeyListenerのしくみ

私が理解していないものは、どのように機能するのですか? のonKeyメソッドでは、値はViewintkeyEvent に与えられません。したがって、リスナーはどのビューとどのキーを聴くべきか、どのイベントをアクティブにするかを「知っていますか?

public class Screen extends Activity { 
double weight = 2.20462; 
EditText kgEdit, lbsEdit; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    kgEdit = (EditText) findViewById(R.id.kgEdit); 
    lbsEdit = (EditText) findViewById(R.id.lbsEdit); 

    kgEdit.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      String kg = kgEdit.getText().toString(); 
      if (kg.isEmpty()) { 
       lbsEdit.setText(""); 
      } else { 
       double num = Double.valueOf(kgEdit.getText().toString()) * weight; 
       lbsEdit.setText(num + ""); 
      } 
      return false; 
     } 
    }); 

    lbsEdit.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      String lbs = lbsEdit.getText().toString(); 
      if (lbs.isEmpty()) { 
       kgEdit.setText(""); 
      } else { 
       double num = Double.valueOf(lbsEdit.getText().toString())/weight; 
       kgEdit.setText(num + ""); 
      } 
      return false; 
     } 
    }); 
} 

}

+1

[onKeyListener](https://developer.android.com/)の公式ドキュメントをご覧ください。リファレンス/アンドロイド/ビュー/ View.OnKeyListener.html)と[リスナー](https://docs.oracle.com/javase/tutorial/uiswing/events/)を参照してください。 –

+0

まあ、彼は両方の編集テキスト用の新しいリスナーを作成するので、この特定の編集テキストのコードがすでに実際のリスナーに入っているため、どの編集テキストにイベントがあるか気にする必要はありません。 –

答えて

0

あなたは、私がこれに答えるために、テキストフィールドのちょうど1に集中するつもりだthis-

EditText editText = (EditText) findViewById(R.id.editText1); 

    editText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 


     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      //do here your calculation 
      String data = s.toString(); 
     } 
    }); 
2

ようaddTextChangedListener使用する必要があります。この最初の行を見てください:このすべてがする

kgEdit = (EditText) findViewById(R.id.kgEdit);

はキロを入力するためEditTextへの参照を取得しています。参照があるので、そのオブジェクトのメソッドを呼び出すことができます。何上記はないことは次の通りである

kgEdit.setOnKeyListener(new View.OnKeyListener() { 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     // ... 
    } 
} 

次に、我々はこれを持っています。最初の行で検索したキログラムについてはEditTextを参照してください。メソッドsetOnKeyListenerは、次のことを行います(hereから): "このビューでハードウェアキーが押されたときに呼び出されるコールバックを登録します。"

これは、このEditTextがフォーカスを持っている間にユーザーがキーを押すたびに通知を受けたいということを、ビューに指示したことを意味しています。あなたはAndroid APIへのこの呼び出しを行い、バックグラウンドでAndroidはあなたが求めているものすべてを処理します。 View view,int keyCodeKeyEvent eventというメソッドが呼び出されます。これらの入力を処理するメソッドを提供します。あなたのコードのどこにもあなたはメソッドを呼び出す必要はありません。Androidはそれを見たり、心配する必要がないバックグラウンドで呼び出します。

kgEditのメソッドを呼び出したので、次のコードはkgEditがフォーカスされ、キーが入力されたときにのみ呼び出されることを意味します。したがって、もう1つのEditTextと混同することはありません。後で、独自のメソッド呼び出しを取得します。ここでsetOnKeyListener内のコードの残りの部分だ:

String kg = kgEdit.getText().toString(); 
if (kg.isEmpty()) { 
    lbsEdit.setText(""); 
} else { 
    double num = Double.valueOf(kgEdit.getText().toString()) * weight; 
    lbsEdit.setText(num + ""); 
} 

return false; 

これは何しても、すでにユーザーが押したキーで更新されているkgEdit内の現在のテキストを取得です。そして、テキストが空であるかどうかを確認し、そうであればlbsEditのテキストを削除します。空でない場合は、テキストを取得し、数値に変換し、kgからポンドに変換して更新してください。lbsEdit

関連する問題