2011-01-24 60 views
9

例如,向編輯文本控件發送退格鍵以刪除字符或發送類似112的字符代碼以編程方式在edittext控件中追加字符。如何將鍵盤事件發送到編輯文本

其實,我需要一個像

void onKeyReceived(int keyCode) 
{ 
    // here I would like to append the keyCode to EditText, I know how to add a visible character, but what about some special keys, like arrow key, backspace key. 
} 

回答

1

您在您的活動的關鍵事件的方法。例如,此代碼偵聽back按鍵:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    { 
    finish(); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

不是我想要的,我需要以編程方式設置一個鍵 – virsir 2011-01-24 06:13:13

1

嘗試實現TextWatcher接口。

它有3個方法,你需要覆蓋。

public void afterTextChanged(Editable s) { 

    Log.v("afterTextChanged","here"); 
} 
public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    Log.v("beforeTextChanged","here"); 
} 

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

我認爲這會奏效。

+0

我不想監視編輯文本的變化,但我想設置一些字符到編輯控件中,特別是對於某些特殊鍵,比如'backspace' – virsir 2011-01-24 08:14:29

1

只是使用setText方法來做到這一點。如果你想模擬一個退格,你可以做這樣的事情。

String curText = mEditText.getText(); 
if(!curText.equals("")){ 
    mEditText.setText(curText.subString(0, curText.length - 1)); 
} 
1
如果你想有一個點擊監聽器,做到這一點的最好辦法

是這樣的:

View textfield = findViewById(R.id.textfield); 
textfield .setOnClickListener(new View.OnClickListener() { 
public void onClick(View v) { 
/*your code for the click event here*/ }}); 

,如果你想退格鍵,這樣做:

public void backSpace() { 
EditText textfield = (EditText)findViewById(R.id.textfield); 
    try { 
     textfield.getText().delete(textfield.getSelectionEnd() - 1, textfield.getSelectionStart()); 
    } catch (Exception e) { 
     try { 
      textfield.getText().delete(textfield.length() - 1, textfield.length()); 
     } catch (Exception myException) { 
     //textfield.getText().delete(textfield.length(), textfield.length() - 1); 
     } 
    } 
} 
如果你想

要在EditText中附加字符,請執行以下操作:

EditText textfield = (EditText)findViewById(R.id.textfield); 
textfield.setText(textfield.getText().concat("112")); 
+0

這個不管用。光標可以在編輯文本中的任何地方,這隻能刪除文本末尾的字符。 OP想要發送一個「虛擬按鍵」到編輯文本。 – Torben 2012-01-05 19:25:54

+1

這不會將它們從文本的末尾移除,這會將它們從選區的開始處移至選區的末尾,並且如果沒有選區,則將其從光標後面的任何字符中移除。 – Ephraim 2012-01-11 16:29:51

1

模擬退格鍵,只是廣告代碼

editText.setText(editText.getText().substring(0,editText.getText().length()-1)) 
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 

模擬加入一個字符,把代碼

editText.setText(editText.getText() + (char) charCode) 

getWindow()setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)。

+0

只能從字符串的末尾刪除文本。如果光標位於字符串中間,該怎麼辦? – Torben 2012-01-05 19:30:18

7

的回答你的問題是不是所有的清楚,但我想你想修改/當按下某些按鈕文本追加到一個TextView。如果是這樣,你想要結合一些現有的答案。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    (TextView) textView = (TextView) findViewById(R.id.myTextView); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    switch(keyCode) { 
    case KeyEvent.KEYCODE_BACK: 
     // user pressed the "BACK" key. Append "_back" to the text 
     textView.append("_back"); 
     return true; 
    case KeyEvent.KEYCODE_DEL: 
     // user pressed the "BACKSPACE" key. Append "_del" to the text 
     textView.append("_del"); 
     return true; 
    default: 
     return super.onKeyDown(keyCode, event); 
    } 
} 

是否對你有處理每種情況下返回true(如上)或您的switch語句之後總是返回super.onKeyDown(keyCode, event);將取決於您的具體要求。檢查文檔的行爲onKeyDown

如果不是在每種情況下追加文本要刪除一個字符或移動光標,您可以在每個case語句中執行此操作。查看TextView documentation,瞭解可以調用的不同方法。也可以查看KeyEvent documentation以查看可以檢查的密鑰列表。

1

看一看這篇文章:creating-input-method.html。基本上,您可以手動發送KeyEvents或者您可以在應用程序的Input View中手動edit and commit text around the cursor。這些都是通過IME的InputConnection完成的。

希望這有助於

14

要發送一個模擬退格鍵按下EditText你必須發送按鍵和釋放事件。像這樣:

mEditText.dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 
    KeyEvent.KEYCODE_DEL, 0)); 
mEditText.dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_UP, 
    KeyEvent.KEYCODE_DEL, 0)); 

這可以用來發送任何其他的密鑰代碼,而不僅僅是刪除。

相關問題