我正在尝试在Android中创建一个简单的日历应用程序,主要用于个人学习,因为我不熟悉Android(以及Java)。
基本上,它是一个ListView,显示当月的当前日期,当点击时,会打开一个询问事件描述的对话框。
显然,此对话框有一个OK按钮,单击该按钮时,应使用EditText的输入更新ListView。
但是,我无法使用OnClickListener使OK按钮起作用,无论我尝试什么,我在设置它的行上都会出现NullPointerException。
public class SimpleCalendar extends ListActivity {
public static Context appContext;
public static int nMonthChoice = CalendarIO.myCalendar.get(Calendar.MONTH);
private static ArrayAdapter aAd;
private static String[] ArrayOfDays;
final private static String[] dayNames = {"Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday"};
Dialog userInput;
int currentDay;
EditText dialogInput;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
appContext = this;
TextView tv = new TextView(this);
CalendarIO.initCalendar(tv);
CalendarIO.myCalendar.set(Calendar.MONTH, nMonthChoice);
updateMonth();
aAd = new ArrayAdapter(this, R.layout.main, ArrayOfDays);
setListAdapter(aAd);
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
LinearLayout dialogLayout = (LinearLayout) findViewById(R.id.dLL);
currentDay = position + 1;
dialogInput = (EditText) findViewById(R.id.dET);
userInput = new Dialog(appContext);
userInput.setContentView(R.layout.dialog);
userInput.setTitle("New Event");
Button dBtn = new Button(appContext);
dBtn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
userInput.dismiss();
CalendarIO.myCalendar.set(Calendar.DAY_OF_MONTH, currentDay);
SimpleCalendar.updateMonth();
CalendarIO.CalendarEvents.put(CalendarIO.myCalendar.get(Calendar.DAY_OF_YEAR), dialogInput.getText());
SimpleCalendar.aAd = new ArrayAdapter(appContext, R.layout.main, ArrayOfDays);
setListAdapter(SimpleCalendar.aAd);
}});
dialogLayout.addView(dBtn);
userInput.show();
}
});
}
public static void updateMonth() {
int nCounter, nDaysInMonth;
String sCurrentEvent;
String currentDay;
nDaysInMonth = CalendarIO.myCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
ArrayOfDays = new String[nDaysInMonth];
for (nCounter = 0; nCounter < nDaysInMonth; nCounter++) {
CalendarIO.myCalendar.set(Calendar.DAY_OF_MONTH, nCounter + 1);
sCurrentEvent = (String) CalendarIO.CalendarEvents.get(
CalendarIO.myCalendar.get(Calendar.DAY_OF_YEAR));
currentDay = dayNames[CalendarIO.myCalendar.get(Calendar.DAY_OF_WEEK) - 1];
ArrayOfDays[nCounter] =
currentDay + ", " + MonthView.monthNames[nMonthChoice]
+ " " + (nCounter + 1);
try {
if (!sCurrentEvent.equals("")) {
ArrayOfDays[nCounter] += ("\t- " + sCurrentEvent + "\n");
}
} catch (NullPointerException e) {//don't do anything}
}
}
}
}
我知道代码有点难以理解,但我希望你能承受它。我还打算稍后清理一些全局变量。
无论如何,这些是输入的两种主要方法。 updateMonth()将我的CalendarIO类的哈希映射转换为字符串数组,当然,onCreate是我的主要Activity方法。
当我运行它时,亚行给了我:
17:51:53.814 22161 ERROR AndroidRuntime FATAL EXCEPTION: main
17:51:53.814 22161 ERROR AndroidRuntime java.lang.NullPointerException
17:51:53.814 22161 ERROR AndroidRuntime at
org.me.simplecalendar.SimpleCalendar$1.onItemClick(SimpleCalendar.java:80)
第80行是dialogLayout.addView(dBtn);
这是我最近的尝试:尝试将新创建的按钮添加到我的XML定义的LinearLayout。
我也尝试过用XML定义的按钮,只是添加一个监听器。那也抱怨NPE。
另外,我已经尝试用XML定义侦听器并将其指向类中的方法,但它会抛出一个错误,说它无法在ComponentInfo类中找到我的方法,这有点奇怪 - 但我确定这只是我还没有学到的东西。
我的努力已经结束了。
非常感谢任何建议。
答案 0 :(得分:2)
好像你的空指针引用可能是你的dialogLayout
。这是因为您在致电findByViewId
之前致电SetContentView
。在调用任何SetContentView
方法之前,您需要致电findByViewId
。理想情况下,您应该在onCreate
方法的开头执行此操作。
答案 1 :(得分:1)
对话框按钮使用DialogInterface.OnClickListener而不是View.OnclickListener
答案 2 :(得分:0)
感谢您的回答。最后,我决定使用带有自定义View的AlertDialog。 我一开始并不知道他们支持自定义视图(我是新手:P)。日历现在很棒!