对OnClickListener进行子类化

时间:2011-03-21 22:01:02

标签: java android

我正在尝试在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类中找到我的方法,这有点奇怪 - 但我确定这只是我还没有学到的东西。

我的努力已经结束了。

非常感谢任何建议。

3 个答案:

答案 0 :(得分:2)

好像你的空指针引用可能是你的dialogLayout。这是因为您在致电findByViewId之前致电SetContentView。在调用任何SetContentView方法之前,您需要致电findByViewId。理想情况下,您应该在onCreate方法的开头执行此操作。

答案 1 :(得分:1)

对话框按钮使用DialogInterface.OnClickListener而不是View.OnclickListener

答案 2 :(得分:0)

感谢您的回答。最后,我决定使用带有自定义View的AlertDialog。 我一开始并不知道他们支持自定义视图(我是新手:P)。日历现在很棒!