2016-10-20 82 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)和[listeners](https://docs.oracle.com/javase/tutorial/uiswing/events/)。 –

+0

嗯,他爲這兩個edittext創建了一個新的Listener,所以他不必費心編輯文本得到一個事件,因爲這個特定編輯文本的代碼已經在實際的監聽器中了。 –

回答

0

你必須使用addTextChangedListener喜歡這 -

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

我將只專注於文本字段1〜回答這個問題。看看這個第一行:

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進行此調用,並在後臺處理您處理的所有問題。它會調用View viewint keyCodeKeyEvent event的方法。你給它一個方法,然後處理這些輸入。因此,無需在代碼中調用該方法,Android會在後臺調用該方法,您將永遠不必看到或擔心該方法。

現在,因爲你叫上kgEdit的方法,這意味着下面的代碼時kgEdit集中和按鍵輸入纔會被調用,因此沒有與其他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轉換爲lbs並更新lbsEdit