タスクリストアプリを作成しています。タスクごとに、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は変更されますか?