2011-01-24 25 views
9

Ví dụ: gửi phím xóa để điều khiển văn bản chỉnh sửa để xóa ký tự hoặc gửi mã char như 112 để thêm ký tự trong điều khiển văn bản theo chương trình.Cách gửi sự kiện quan trọng đến văn bản chỉnh sửa

Thực ra, tôi cần một phương pháp như

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. 
} 

Trả lời

1

Kiểm tra cho các sự kiện quan trọng trong hoạt động của bạn. ví dụ: mã này nghe cho back nhấn phím:

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

không phải tôi muốn, tôi cần đặt khóa theo chương trình – virsir

1

thử triển khai giao diện TextWatcher.

nó có 3 phương pháp bạn cần ghi đè.

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) { 
} 

Tôi nghĩ điều này sẽ hiệu quả.

+0

Tôi không muốn theo dõi thay đổi của văn bản chỉnh sửa, nhưng tôi muốn đặt một số char vào điều khiển chỉnh sửa đặc biệt là đối với một số phím đặc biệt như 'backspace' – virsir

1

chỉ cần sử dụng phương thức setText để thực hiện việc này. Nếu bạn muốn mô phỏng một backspace bạn có thể làm một cái gì đó như thế này.

String curText = mEditText.getText(); 
if(!curText.equals("")){ 
    mEditText.setText(curText.subString(0, curText.length - 1)); 
} 
1

nếu bạn muốn có một người biết lắng nghe nhấp chuột, cách tốt nhất để làm điều đó là thế này:

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

nếu bạn muốn có một nút backspace, làm điều này:

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); 
     } 
    } 
} 

nếu bạn muốn để thêm một ký tự trong EditText, hãy thực hiện việc này:

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

sẽ không làm việc. Con trỏ có thể ở bất kỳ đâu trong văn bản chỉnh sửa và điều này chỉ xóa các ký tự ở cuối văn bản. OP muốn gửi "báo chí chính ảo" cho văn bản chỉnh sửa. – Torben

+1

điều này không xóa chúng khỏi phần cuối của văn bản, điều này sẽ xóa chúng khỏi phần đầu của vùng chọn đến cuối lựa chọn và nếu không có lựa chọn, nó sẽ xóa nó khỏi ký tự bất kỳ sau con trỏ. – Ephraim

1

để mô phỏng phím backspace, chỉ mã quảng cáo

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

để mô phỏng thêm một nhân vật, đặt mã

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

GetWindow() setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE).

+0

Chỉ xóa văn bản từ cuối chuỗi. Điều gì sẽ xảy ra nếu con trỏ ở giữa chuỗi? – Torben

7

Câu hỏi của bạn không phải là tất cả những gì rõ ràng, nhưng tôi nghĩ rằng bạn muốn thay đổi/bổ sung văn bản để một TextView khi nút nào đó được ép. Nếu vậy, bạn muốn kết hợp một số câu trả lời hiện có.

@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); 
    } 
} 

Cho dù trở true cho từng trường hợp bạn đã xử lý (như trên) hoặc luôn trở super.onKeyDown(keyCode, event); sau khi tuyên bố switch của bạn sẽ phụ thuộc vào yêu cầu chính xác của bạn. Kiểm tra tài liệu về hành vi của onKeyDown

Nếu, thay vì thêm văn bản trong mỗi trường hợp bạn muốn xóa ký tự hoặc di chuyển con trỏ, bạn có thể thực hiện điều đó trong mỗi câu hỏi case. Hãy xem TextView documentation để biết các phương pháp khác nhau mà bạn có thể gọi. Ngoài ra, hãy xem KeyEvent documentation để biết danh sách các phím bạn có thể kiểm tra.

1

Hãy xem bài viết này: creating-input-method.html. Về cơ bản, bạn có thể gửi thủ công KeyEvents hoặc bạn có thể theo cách thủ công edit and commit text around the cursor trong ứng dụng Input View của ứng dụng này. Tất cả đều được thực hiện qua số InputConnection IME của bạn.

Hy vọng điều này sẽ giúp,

14

Để gửi một phím backspace được mô phỏng nhấn vào EditText, bạn phải gửi cả các sự kiện nhấn và thả phím. Như thế này:

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)); 

Điều này có thể được sử dụng để gửi bất kỳ mã khóa nào khác, không chỉ xóa.

Các vấn đề liên quan