0

ListActivity 其中项目包含一个复选框,textview & imagevie(alramclock)。 我试图通过调整该图像视图来为每个任务提供日期 n 时间。 那就是在快照中显示这样的错误

主要是为 ListActivity 设置 listadapter 我使用了不同的适配器类(TaskAdapter.java),我在其中覆盖了 getview(),并在其中编写了代码敌人复选框、textview 和 imageview。TextView & checkbox click events & checkedchange working & ImageViews click event也有效。但问题是我试图在单击 ImageView 时打开 DatePicker,但它在快照中显示下面的错误。

我的代码在这里,HomeActivity

package com.v3.todo;

import java.util.ArrayList;
import java.util.Calendar;

import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.app.TimePickerDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.TimePicker;

public class HomeActivity extends ListActivity {
    DBAdapter db;
    Cursor cr;
    CheckBox[] chk;
    static String[] valChk;
    static int Task_Id, taskId;
    static int[] idchk;
    static String Task_Nm, taskNm;
    EditText edTask;
    Button btnAdd;
    String newTask = "";
    int order;
    Calendar c = Calendar.getInstance();
    private int mYear, mMonth, mDay, mHour, mMinute;
    static final int TIME_DIALOG_ID = 1, DATE_DIALOG_ID = 0;
    String date = "", time = "", dateTime = "";
    // ArrayList al = new ArrayList();
    static ArrayList<Task> m_tasks = new ArrayList<Task>(), t_tasks = null;
    TaskAdapter m_adapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.setTitle("To-Do Lists");

        btnAdd = (Button) findViewById(R.id.btnAdd);
        edTask = (EditText) findViewById(R.id.etAddTask);
        edTask.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus == true) {
                    if (edTask.getText().toString()
                            .compareTo("Add task here...") == 0) // default text
                    {
                        edTask.setText("");
                    }
                }
            }
        });

        db = new DBAdapter(HomeActivity.this);
        m_tasks = getTasks();
        if (m_tasks.size() != 0) {
            this.m_adapter = new TaskAdapter(this, R.layout.addchecktomain,
                    m_tasks);
            // lv1.setAdapter(this.m_adapter);
            System.out.println("creating");
            setListAdapter(this.m_adapter);
        } else {

            RelativeLayout rl = (RelativeLayout) findViewById(R.id.layout);
            TextView tv = new TextView(this);
            tv.setText("No To-Do Lists");
            tv.setTextSize(22);
            rl.addView(tv);
        }

        btnAdd.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                newTask = edTask.getText().toString();

                String min = Integer.toString(c.get(Calendar.MINUTE));
                String hr = Integer.toString(c.get(Calendar.HOUR));
                String dd = Integer.toString(c.get(Calendar.DATE));
                String mm = Integer.toString(c.get(Calendar.MONTH));
                String yyyy = Integer.toString(c.get(Calendar.YEAR));
                if (min.length() == 1)
                    min = "0" + min;
                if (hr.length() == 1)
                    hr = "0" + hr;
                if (dd.length() == 1)
                    dd = "0" + dd;
                if (mm.length() == 1)
                    mm = "0" + mm;
                String dtCreate = mm + "-" + dd + "-" + yyyy + " " + hr + ":"
                        + min;
                if (newTask.equals("")) {
                    alertboxNeutral("Warning", "Task should not be empty!",
                            "Okay");
                }
                if (newTask.length() < 2) {
                    alertboxNeutral("Warning",
                            "Task should not be less than 2 Letters", "Okay");
                } else {
                    try {
                        db.open();
                        long id1;
                        order = db.getLastPriority();
                        if (order == 0)
                            id1 = db.insertINtask(taskNm, dtCreate, null, 0, 1);
                        else
                            id1 = db.insertINtask(taskNm, dtCreate, null, 0,
                                    order + 1);

                    } catch (Exception ex) {
                        System.out.println("Within AddTask " + ex.toString());
                    } finally {
                        db.close();
                    }
                    alertboxNeutral("Success", "Saved.", "Okay");
                }
            }
        });
    }

    // Method to fetch Uncompleted tasks from db with ID
    public ArrayList<Task> getTasks() {
        t_tasks = new ArrayList<Task>();
        try {
            db.open();
            cr = db.getUncompletedTask();
            if (cr.moveToFirst()) {
                do {
                    Task t1 = new Task();
                    String[] str = new String[2];
                    str[0] = cr.getString(0);
                    str[1] = cr.getString(1);
                    t1.setTaskID(cr.getString(0));
                    t1.setTaskName(cr.getString(1));
                    t_tasks.add(t1);
                } while (cr.moveToNext());
            }
        } catch (Exception ex) {
            System.out.println("Within Home " + ex.toString());
        } finally {
            cr.close();
            db.close();
        }

        return t_tasks;
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
        menu.setHeaderTitle("Task");
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
        System.out.println("v.getId=" + v.getId());
        Task_Id = (Integer) v.getTag();

    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
                .getMenuInfo();

        switch (item.getItemId()) {
        case R.id.edit_task:
            Intent i1 = new Intent(HomeActivity.this, EditTaskActivity.class);
            i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i1);

            return true;
        case R.id.delete_task:
            // database functions
            boolean f = false;
            try {
                db.open();
                f = db.deleteTask(Task_Id);
            } catch (Exception ex) {
                System.out.println("Within Home " + ex.toString());
            } finally {
                db.close();
            }
            if (f == true)
                alertboxNeutral("Success", "Deleted.", "Okay");
            return true;
        default:
            return super.onContextItemSelected(item);
        }
    }

    public void alertboxNeutral(String title, String message, String positive) {
        AlertDialog.Builder alertbox = new AlertDialog.Builder(
                HomeActivity.this);
        if (title.equals("Warning")) {
            alertbox.setTitle(title);
            alertbox.setMessage(message);
            alertbox.setPositiveButton(positive,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            Intent i = new Intent(HomeActivity.this,
                                    HomeActivity.class);
                            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(i);
                        }
                    });
            alertbox.show();
        } else if (title.equals("Success")) {
            alertbox.setTitle(title);
            alertbox.setMessage(message);
            alertbox.setPositiveButton(positive,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            Intent i = new Intent(HomeActivity.this,
                                    HomeActivity.class);
                            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(i);
                        }
                    });
            alertbox.show();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

        case R.id.add_task:
            Intent i1 = new Intent(this, AddTaskActivity.class);
            i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i1);
            break;
        case R.id.list_completed:
            Intent i2 = new Intent(this, ListCompletedActivity.class);
            i2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i2);
            break;
        case R.id.rearrange:
            Intent i3 = new Intent(this, RearrangeActivity.class);
            i3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i3);
            break;
        case R.id.exit:
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            break;
        }

        return true;
    }

    /*
     * @Override protected void onPause() { // TODO Auto-generated method stub
     * super.onPause(); finish(); }
     */

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        try {
            db.open();
            m_tasks = getTasks();
        } catch (Exception ex) {
            System.out.println("Within Home " + ex.toString());
        } finally {
            db.close();
        }
        m_adapter = new TaskAdapter(this, R.layout.addchecktomain, m_tasks);

        System.out.println("notify data changed");
        // m_adapter.notifyDataSetInvalidated();
        // m_adapter.notifyDataSetChanged();
        setListAdapter(this.m_adapter);
        super.onResume();

    }

    /*
     * @Override public void onBackPressed() { // TODO Auto-generated method
     * stub db.open(); m_tasks = getTasks(); db.close();
     * System.out.println("notify data changed on back pressed");
     * m_adapter.notifyDataSetInvalidated(); m_adapter.notifyDataSetChanged();
     * super.onBackPressed(); }
     */
    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

        public void onDateSet(DatePicker view, int year, int monthOfYear,
                int dayOfMonth) {
            mYear = year;
            mMonth = monthOfYear;
            mDay = dayOfMonth;
            updateDisplay();
        }
    };

    private void updateDisplay() {
        // tvDt.setText(new StringBuilder().append(mMonth +
        // 1).append("-").append(mDay).append("-").append(mYear).append(" "));

    }

    // the callback received when the user "sets" the time in the dialog
    private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            mHour = hourOfDay;
            mMinute = minute;
            updateDisplay();
        }
    };

    // updates the time we display in the TextView
    private void timeDisplay() {
        // time=(String)(new
        // StringBuilder().append(pad(mHour)).append(":").append(pad(mMinute)));
    }

    private static String pad(int c) {
        if (c >= 10)
            return String.valueOf(c);
        else
            return "0" + String.valueOf(c);
    }

    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case 0:
            return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
                    mDay);
        }
        return null;
    }

    public static void setDate() {
        // showDialog(0);
    }
}



TaskAdapter.java
package com.v3.todo;

import java.util.ArrayList;
import java.util.Calendar;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.DatePicker;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

public final class TaskAdapter extends ArrayAdapter<Task> {
    ArrayList<Task> tasks;
    Context context1;
    CheckBox chk;
    TextView tv;
    ImageView imgAlram;
    DBAdapter db;
    static int TaskId;
    static int RId;
    Calendar c = Calendar.getInstance();
    boolean f = false;
    private int mYear, mMonth, mDay, mHour, mMinute;
    static final int TIME_DIALOG_ID = 1, DATE_DIALOG_ID = 0;
    String date = "", time = "", dateTime = "";

    public TaskAdapter(Context context, int textViewResourceId,
            ArrayList<Task> tasks) {
        super(context, textViewResourceId, tasks);
        this.tasks = tasks;
        context1 = context;
        RId = textViewResourceId;
    }

    public int getCount() {
        return tasks.size();
    }

    public Task getItem(int position) {
        return tasks.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        final int pos = position;
        final int dbid;
        View v = convertView;

        if (v == null) {
            LayoutInflater vi = (LayoutInflater) context1
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.addchecktomain, null);
        }
        Task t = tasks.get(position);
        if (t != null) {
            chk = (CheckBox) v.findViewById(R.id.cboTask);
            tv = (TextView) v.findViewById(R.id.tvTask);
            imgAlram = (ImageView) v.findViewById(R.id.imageAlram);

            if (chk != null) {
                chk.setId(Integer.parseInt(t.getTaskId()));

                chk.setText("");
                // chk.setTag(Integer.parseInt(t.getTaskId()), t.getTaskName());

                chk.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                        int taskId = buttonView.getId();
                        if (isChecked) {
                            // /call setTaskComplete(i)
                            // / reset list view or refresh list view
                            String min = Integer.toString(c
                                    .get(Calendar.MINUTE));
                            String hr = Integer.toString(c.get(Calendar.HOUR));
                            String dd = Integer.toString(c.get(Calendar.DATE));
                            String mm = Integer.toString(c.get(Calendar.MONTH));
                            String yyyy = Integer.toString(c.get(Calendar.YEAR));
                            if (min.length() == 1)
                                min = "0" + min;
                            if (hr.length() == 1)
                                hr = "0" + hr;
                            if (dd.length() == 1)
                                dd = "0" + dd;
                            if (mm.length() == 1)
                                mm = "0" + mm;
                            String dtComplete = mm + "-" + dd + "-" + yyyy
                                    + " " + hr + ":" + min;
                            try {
                                db = new DBAdapter(context1);
                                db.open();
                                f = db.setTaskComplete(taskId, dtComplete);
                            } catch (Exception ex) {
                                System.out.println("Within Home "
                                        + ex.toString());
                            } finally {
                                db.close();
                            }
                            if (f == true) {
                                // HomeActivity.referesh = 1;
                                Intent intent = new Intent(context1,
                                        HomeActivity.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                                        | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                // HomeActivity.
                                context1.startActivity(intent);
                                Toast.makeText(context1, "Task Completed",
                                        Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
            if (tv != null) {
                tv.setText(t.getTaskName());
                dbid = Integer.parseInt(t.getTaskId());
                tv.setTag(dbid);

                tv.setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        Toast.makeText(
                                context1,
                                "You have chosen the task: " + " "
                                        + v.getTag().toString() + "  Id: "
                                        + dbid + "::" + pos, Toast.LENGTH_LONG)
                                .show();
                    }
                });
                ((Activity) context1).registerForContextMenu(tv);
            }
            if (imgAlram != null) {
                imgAlram.setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        // Write ur code here
                        Toast.makeText(context1, "You have chosen the Alram ",
                                Toast.LENGTH_LONG).show();
                        ((Activity) context1).showDialog(0);
                        ((Activity) context1).showDialog(TIME_DIALOG_ID);
                    }
                });
            }
        }
        return v;
    }

DatePicker dialog only open within an activity but I am call the ((Activity) context1).showDialog(0); in TaskAdapter.java class in ImageView onClick event, and all other code is in HomeActivity. ANd it give s error like snapshot. How to achieve within TaskAdapter.java class. please give me the answer. Thank you

4

3 回答 3

1

Day of month starts from 1 not from 0. You must have somewhere mDay = 0;

于 2011-05-13T13:19:12.710 回答
1

You have an IllegalArgumentException in the DatePicker's day (read the 2nd and fourth red lines to know how I know that). The 9th red line tells me that the problem is in your HomeActivity.java file, in the line 363, which is part of the onCreateDialog method. In this case, it is clearly the DatePickerDialog constructor.

正如 dziobas 所说,您可能有一个基准零日,这可能是问题所在。mDay 也可以设置为高于该月允许的数字。您可能希望初始化私有 mDay = 1 而不是保持原样。

于 2011-05-14T16:58:33.150 回答
1

而且默认情况下,DatePickerDialog 中的月份值将始终从 0 开始,因此您打印月份的值,如果得到 0,则添加 +1

于 2011-05-16T04:08:29.063 回答