我对Android很新,我一直在阅读Wrox Press的 Professional Android 2应用程序开发一书。最初的教程之一是一个简单的待办事项列表,它只是一个接一个地添加项目(它不保存信息或类似的东西,稍后会讲授)。我遇到的问题是它不仅打印我写的东西,它还添加了一个空项目,这样(对不起,我没有超过10个声誉,所以我无法发布图像。希望你得到的想法):
(空步)
第二项任务
(空白区域)
第一项任务
本书中编写的代码与网页here上显示的代码相同,并且勘误表部分中没有确认错误:
package com.paad.todoList;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
public class Todo_ListActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Get references to UI widgets
ListView myListView = (ListView) findViewById(R.id.myListView);
final EditText myEditText = (EditText)findViewById(R.id.myEditText);
//Creates the array list of to do items
final ArrayList <String> todoItems = new ArrayList <String>();
//Create the array adapter to bind the array to the listview
final ArrayAdapter <String> aa;
aa = new ArrayAdapter <String> (this, android.R.layout.simple_list_item_1, todoItems);
//Bind the array adapter to the listview
myListView.setAdapter(aa);
myEditText.setOnKeyListener (new OnKeyListener(){
public boolean onKey (View v, int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER){
todoItems.add(0, myEditText.getText().toString());
aa.notifyDataSetChanged();
myEditText.setText("");
return true;
}
else return false;
}
});
}
}
我的main.xml是这样的:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:id="@+id/myEditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="New To Do Item"
/>
<ListView
android:id="@+id/myListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
我知道这个错误来自这一行:
myEditText.setText("");
如果我注释掉那一行,那么程序会添加我写的两次:
Second Task
Second Task
First Task
First Task
如果我在引号内添加内容......
myEditText.setText("Error");
然后打印出来:
Error
Second task
Error
First Task
我查了Android API,但找不到解决方案。有人可以帮我吗?我怎么能用那些有用的东西代替呢?
答案 0 :(得分:2)
每按一次键就会调出2个事件:KEY_DOWN,然后是KEY_UP事件。在你的代码中,你不会过滤那些,所以它只是为2激发。第一个在editText中有文本,而第二个在editText的文本被刷新后被触发。
您可以在onKey方法中添加以下内容:
if (event.getAction()!=KeyEvent.ACTION_DOWN)
return true;
这将知道按键事件,但你不会对它做任何事情。然后,当密钥到来时,你将使用那个。
答案 1 :(得分:1)
实际上KEYCODE_DPAD_CENTER
是方向性Pad中心键。也可以通过轨迹球运动合成。你需要提出这个代码,但它并不顺利。
OnKeyListener listener = new OnKeyListener(){
public boolean onKey (View v, int keyCode, KeyEvent event){
if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER && event.getAction()!=KeyEvent.ACTION_DOWN){
todoItems.add(0, myEditText.getText().toString());
myEditText.findFocus();
myEditText.setText("");
aa.notifyDataSetChanged();
return true;
}
else return false;
}
};