1

タスクリストアプリを作成しています。タスクごとに、RelativeLayoutが作成され、その中にタスクの名前が付いたCheckBoxとTextViewがあります。次に、既存のLinearLayoutに追加されます。その部分はすべて機能します。

メソッドdeleteTask(View view)を呼び出す「DeleteTask」ImageButtonを追加しました。データベースからタスクを削除するdeleteTask()。実行しようとすると、「java.lang.IllegalStateException:アクティビティのメソッドを実行できませんでした」というエラーが表示されます。

01-16 13:15:48.975: E/AndroidRuntime(16881): FATAL EXCEPTION: main
01-16 13:15:48.975: E/AndroidRuntime(16881): java.lang.IllegalStateException: Could not execute method of the activity
01-16 13:15:48.975: E/AndroidRuntime(16881):    at android.view.View$1.onClick(View.java:3591)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at android.view.View.performClick(View.java:4084)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at android.view.View$PerformClick.run(View.java:16966)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at android.os.Handler.handleCallback(Handler.java:615)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at android.os.Looper.loop(Looper.java:137)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at android.app.ActivityThread.main(ActivityThread.java:4931)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at java.lang.reflect.Method.invokeNative(Native Method)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at java.lang.reflect.Method.invoke(Method.java:511)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at dalvik.system.NativeStart.main(Native Method)
01-16 13:15:48.975: E/AndroidRuntime(16881): Caused by: java.lang.reflect.InvocationTargetException
01-16 13:15:48.975: E/AndroidRuntime(16881):    at java.lang.reflect.Method.invokeNative(Native Method)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at java.lang.reflect.Method.invoke(Method.java:511)
01-16 13:15:48.975: E/AndroidRuntime(16881):    at android.view.View$1.onClick(View.java:3586)
01-16 13:15:48.975: E/AndroidRuntime(16881):    ... 11 more
01-16 13:15:48.975: E/AndroidRuntime(16881): Caused by: java.lang.ClassCastException: android.widget.ImageView cannot be cast to android.widget.CheckBox
01-16 13:15:48.975: E/AndroidRuntime(16881):    at com.rook.todolist.MainActivity.deleteTask(MainActivity.java:177)
01-16 13:15:48.975: E/AndroidRuntime(16881):    ... 14 more

 

これが私のコードです。私が関連すると思ったものを含めようとしましたが、必要に応じてもっと含めることができます。

ImageButtonによって呼び出されたdeleteTask()

public void deleteTask (View view) {

    // instantiate dbhandler
    DatabaseHandler db = new DatabaseHandler(this);

    // get tasks
    List<Task> tasks = db.getAllTasks();

    for(Task t : tasks) {
        CheckBox cb = (CheckBox) findViewById(t.getID() + 10000);
        if(cb.isChecked()) { db.deleteTask(t); }
    }

    buildTaskList();

}//end deleteTask()

チェックボックスを作成するとき、LayoutParamsで参照できるIDが必要だったので、それらのIDを10,000+タスクのIDに設定しました。覚えやすいものです。

buildTaskList()は、マスターLinearLayoutからすべてのビューを削除し、データベース内のタスクに基づいてそれらを再構築するだけです。

CheckBoxがチェックされている場合に呼び出されるdeleteTask(タスクタスク) 。

// Deleting single task
public void deleteTask (Task task) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_TASKS, KEY_ID + " =?", new String[] { String.valueOf(task.getID()) });
}

削除操作は引き続き実行されます。アプリをリロードすると、削除されるはずだったタスクがなくなります。また、deleteTask()を最初に作成したときにテストしましたが、機能しました。

編集 多くの人が指摘しているように、この行findViewById(t.getID() + 10000);はチェックボックスではなくImageViewを返していました。しかし、ログステートメントを挿入して、IDが作成されたメソッドとdeleteTask()メソッドの両方でIDを吐き出し、IDは同じです! ビューに割り当てられたIDは変更されますか?

4

3 に答える 3

2
Caused by: java.lang.ClassCastException: android.widget.ImageView cannot be cast to android.widget.CheckBox
    at com.rook.todolist.MainActivity.deleteTask(MainActivity.java:177)

で使用するIDはfindViewById()、チェックボックスにキャストできないImageViewを参照します。ビューIDを再確認してください。

// This returns an ImageView...
CheckBox cb = (CheckBox) findViewById(t.getID() + 10000); 
于 2013-01-16T18:48:50.397 に答える
1

ログのように:

ClassCastException:android.widget.ImageViewをandroid.widget.CheckBoxにキャストできません

ImageViewをチェックボックスにキャストしようとしていることを意味します。コードを次のように変更します:

for(Task t : tasks) {
        View view = (View) findViewById(t.getID() + 10000);

        if( view instanceof CheckBox ) {
          CheckBox cb = (CheckBox) view;
          if(cb.isChecked()) { db.deleteTask(t); }
    }

    }
于 2013-01-16T18:51:17.030 に答える
1

問題はここにあります

01-16 13:15:48.975: E/AndroidRuntime(16881): Caused by: java.lang.ClassCastException: android.widget.ImageView cannot be cast to android.widget.CheckBox
01-16 13:15:48.975: E/AndroidRuntime(16881):    at com.rook.todolist.MainActivity.deleteTask(MainActivity.java:177)

ImageViewをチェックボックスにキャストしようとしています。おそらく以下のコード行にあります。

 CheckBox cb = (CheckBox) findViewById(t.getID() + 10000);
于 2013-01-16T18:52:07.653 に答える