2016-10-20 6 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/)에 관한 공식 문서를보십시오. reference/android/view/View.OnKeyListener.html) 및 [listers] (https://docs.oracle.com/javase/tutorial/uiswing/events/)를 참조하십시오. –

+0

음, 그는 두 편집 텍스트에 대한 새로운 Listener를 생성하므로 특정 편집 텍스트의 코드가 이미 실제 리스너에 있으므로 어떤 편집 텍스트에 이벤트가 있는지 신경 쓸 필요가 없습니다. –

답변

0

내가이 답변을 텍스트 필드의 단 하나에 초점을거야 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);

은 kg를 입력 할 수있는 EditText에 대한 참조를 얻을 수있다. 이제 레퍼런스가 생겼으므로 그 객체에 대한 메소드를 호출 할 수 있습니다.

kgEdit.setOnKeyListener(new View.OnKeyListener() { 

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

무엇 위의하는 일은 다음과 같다 :

다음으로, 우리는이 있습니다. 첫 번째 줄에서 검색 한 킬로그램 당 EditText을 참조하십시오. setOnKeyListener 메서드는 다음을 수행합니다 (here에서) : "이보기에서 하드웨어 키를 누를 때 호출 할 콜백을 등록하십시오."

이 의미는 사용자가이 EditText에 포커스가있는 동안 사용자가 키를 누를 때마다 알려지기를 원한다는 의미입니다. 당신은 안드로이드 API를 호출하고 배경 안드로이드는 당신이 요구하는 모든 것을 처리합니다. View view, int keyCodeKeyEvent event과 함께 메서드를 호출합니다. 그런 다음 입력을 처리하는 메소드를 제공합니다. 따라서 코드에서 아무 것도 호출하지 않아도 안드로이드는 백그라운드에서 호출 할 수 있습니다. 이제

, 당신은 kgEdit이 집중되고 키가 입력되는 경우에만 호출 될 다음 코드를 의미하므로 다른 EditText와 혼동이 없다 kgEdit에 메소드를 호출하기 때문이다. 그것은 바로 아래에 자신의 메소드 호출을 얻습니다. 이것이하는 일은 이미 누르면 사용자 키 업데이트되었습니다 kgEdit의 현재 텍스트를 얻을 수있다

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

return false; 

다음은 setOnKeyListener 내부 코드의 나머지 부분입니다. 그리고 텍스트가 비어 있는지 확인하고, 그렇다면 lbsEdit의 텍스트를 제거합니다. 비어 있지 않은 경우 텍스트를 가져 와서 숫자로 변환하고 kg에서 파운드로 변환하고 업데이트하십시오. lbsEdit