6

我是 Android 新手,正在研究书中的待办事项列表示例。我有一个 Activity,它在它下面显示一个 EditText 和一个 ListView。有一个 onKey 事件应该将 EditText 中的文本添加到 ListView 并清除 EditText。但是,当我在键盘上按 Enter 时,所发生的只是在 EditText 中添加了一个新行,而在 ListView 中没有添加任何内容。

onCreate 代码是:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_to_do_list);

    // Get UI references
    ListView myListView = (ListView)findViewById(R.id.myListView);
    final EditText myEditText = (EditText)findViewById(R.id.myEditText);
    myEditText.setText("test");
    // Create ArrayList to store To Do items
    final ArrayList<String> toDoItems = new ArrayList<String>();

    // Create ArrayAdapter to bind items to List View
    final ArrayAdapter<String> aa;

    aa = new ArrayAdapter<String>(this,
                                  android.R.layout.simple_list_item_1,
                                  toDoItems);

    // Bind Adapter to List View
    myListView.setAdapter(aa);

    myEditText.setOnKeyListener(new View.OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN)
                if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) ||
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    toDoItems.add(0, myEditText.getText().toString());
                    aa.notifyDataSetChanged();
                    myEditText.setText("");
                    return true;
                }
            return false;
        }
    });
}

我添加了myEditText.setText("test");just 以确保对 myEditText 的引用正常工作,就是这样。我尝试从 onKey 事件中删除 if 语句,但它似乎根本没有注册关键事件。谁能告诉我在这里做错了什么?

4

6 回答 6

15

您可以尝试使用OnEditorActionListener代替:

http://developer.android.com/reference/android/widget/TextView.html#setOnEditorActionListener(android.widget.TextView.OnEditorActionListener)

您可以在 XML 中的 edittext 上进行设置:

android:imeOptions="actionDone"

然后在代码中:

 myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
           // your action here
           return true;
        }
      return false;
    }
 )};
于 2013-08-10T17:37:57.660 回答
4

你用的是虚拟键盘吗?在这种情况下,问题是 OnKeyListener 只能由硬件按钮调用。看看这里:http: //developer.android.com/reference/android/view/View.OnKeyListener.html

第一行说:当硬件按键事件被分派到这个视图时,回调的接口定义。

Perpaps 这将解决您的问题:Validating edittext in Android

于 2013-08-10T17:38:13.573 回答
2

通过将以下属性添加到 EditText 元素,我能够使相同的示例正常工作android:inputType="text"。这改变了为用户提供的软件键盘,并包括一个发送按钮。

在 setOnKeyListener 代码中,我将其更改为以下内容:

    myEditText.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_UP)
                if (keyCode == KeyEvent.KEYCODE_ENTER)
                {
                    todoItems.add(0, myEditText.getText().toString());
                    aa.notifyDataSetChanged();
                    myEditText.setText("");
                    return true;
                }
            return false;
        }
    });

不要使用 KEYCODE_DPAD_CENTER,因为它是具有上、下、左、右箭头的设备的硬件按钮。

于 2014-09-21T15:23:52.783 回答
2

以下代码解决了这样的问题:您只需要像这样添加 addTextChangedListener 即可。Rest 是不言自明的

    editabltText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable)
        {


        }
    });
于 2017-05-13T04:52:06.977 回答
1

而不是setOnKeyListener,尝试实施setOnEditorActionListener。希望这可以帮助。

于 2013-08-10T17:40:39.940 回答
-1

<EditText android:id="@+id/search" android:singleLine="true" android:imeOptions="actionSearch">

尝试添加 singleLine 和 imeOption 属性。

于 2015-08-11T10:14:53.740 回答