2010-09-12 182 views
20

我定義了一個EditText字段,我希望在用戶編輯該字段時得到通知。 所以我想:簡單 - 我添加一個OnKeyListener,所以我做了。但即使編輯了文本字段(甚至顯示輸入的/修改的文本),我也沒有得到任何回調,即LOG輸出不顯示。Android:爲什麼我的OnKeyListener()沒有被調用?

TextView text = new TextView(this); 
    text.setText(...); 
    ... 
    text.setOnKeyListener(new OnKeyListener() 
    {       
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      TextView tv = (TextView)v; 
      CharSequence val = tv.getText(); 
      Log.v(TAG, "value: " + val); 
      // ... rest omitted for brevity 
     } 
    }); 

任何想法,爲什麼回調從未被稱爲?

Michael

PS .:感嘆! Android真的很古怪!看起來我迄今爲止所觸及的幾乎沒有任何東西可以按照人們的期望工作。並且 - 信不信由你 - 我對圖形用戶界面有着豐富的經驗,在Java中(AWT,Swing,SWT,你把它命名爲......)但Android是一個非常強悍的野獸!

+1

@Falmarri魅力,有什麼不好呢?從概念上講,getText返回一個字符序列,因此將返回值存儲在該類型的變量中沒有任何問題。你必須這樣做才能使用getText方法。你不能只改變onKey方法來接受一個TextView,因爲它覆蓋了OnKeyListener中的一個方法。 (可以說,應該有一個@Override,但是在這種情況下它很明顯。) – MatrixFrog 2010-09-13 08:58:56

+1

@Falmari:你顯然沒有爲Android編程。我也會使用字符串,但是Android alas會將CharSequence的所有位置而不是字符串返回,所以您必須頻繁地執行強制轉換或toString()。如果一個方法頭只定義了一個「View」,但你知道它是一個TextView,並且你需要一個只有TextView提供的方法,那你還能做什麼?有更好的建議? – mmo 2010-09-13 15:30:12

回答

18

您是否正在使用軟鍵盤(ime)鍵入編輯文本?我相信onKeyListener只會被來自硬件鍵盤的事件調用。如果可以的話,最好使用TextWatcher。 onKeyListener not working with soft keyboard (Android)

+0

我讀過引用的附錄,這確實是問題。當然,我從來沒有嘗試過使用真正的鍵盤(因爲我的設備沒有任何...),仿真器的鍵盤顯然也沒有觸發這樣的事件。我改變爲一個TextWatcher建議,這就是訣竅!謝謝! – mmo 2010-09-14 12:17:36

1

你說你正在處理EditText,但是你的代碼引用了一個TextView。我的猜測是你的佈局XML文件中有一個EditText,但是你在你的代碼中引用了這個新創建的TextView,實際上甚至在應用程序的用戶界面中都沒有。

如果您的佈局XML文件中已經有EditText,那麼您需要在Java代碼中獲取指向它的指針,可能使用的是findViewById()方法。然後將您的OnKeyListener添加到該EditText。

使用XML定義佈局實際上比一次定義一個組件更有意義(至少在很多情況下(如果不是大多數情況下)),然後將每個組件添加到UI中,就像在Swing中一樣。但它需要一些習慣,毫無疑問。

+0

你是對的 - TextView實際上是一個EditText,不是由「new」創建的,而是使用inflater。爲了簡潔,我在這裏改變了這一點。但我仍然沒有得到任何onKey() - 回調... – mmo 2010-09-13 20:35:21

+0

我可能是錯的,但我不認爲你想在這裏使用inflater。只要執行'setContentView',它就會爲你充氣。我的猜測是,相同的XML會膨脹兩次 - 一次通過'setContentView'並一次通過'LayoutInflater'。因此,您有兩份相同佈局的副本,並且將偵聽器添加到錯誤的副本中。 – MatrixFrog 2010-09-14 02:23:11

+0

不,問題不在於有兩個副本。我甚至在開始添加自己的孩子之前,明確地刪除所有的孩子。這個問題似乎是下面的影響 - 參見Mayra的追加。 – mmo 2010-09-14 12:16:00

7

我有完全相同的問題,但只有一個我的Android應用程序,我從來沒有弄清楚有什麼不同。

我的解決方案雖然是做Mayra建議的,並添加一個TextWatcher來處理TextChanged事件。所以無論文本輸入如何,它都可以工作。

editName.addTextChangedListener(new TextWatcher() { 
     public void afterTextChanged(Editable s) { 
      Button btnSave = (Button)findViewById(R.id.btnSaveToon); 
      if(s.length() > 0) 
       btnSave.setEnabled(true); 
      else 
       btnSave.setEnabled(false); 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      // TODO Auto-generated method stub 
     } 

     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // TODO Auto-generated method stub 
     } 

    }); 

作品像在模擬器上我的HTC啓發

相關問題