java - 我想在单击任务时添加子任务,但是当我单击任务时出现以下错误

标签 java android

单击任务以添加子任务时出现的错误:

2020-04-23 14:52:48.749 12289-12289/com.example.justdoit E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.justdoit,
PID: 12289 java.lang.RuntimeException: Unable to start activity ComponentInfo {
  com.example.justdoit/com.example.justdoit.ItemActivity
}

: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.material.floatingactionbutton.FloatingActionButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.material.floatingactionbutton.FloatingActionButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at com.example.justdoit.ItemActivity.onCreate(ItemActivity.java:61) at android.app.Activity.performCreate(Activity.java:7009) at android.app.Activity.performCreate(Activity.java:7000) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

ItemActivity 类:

public class ItemActivity extends AppCompatActivity {
  Toolbar item_toolbar;
  RecyclerView rv_item;
  FloatingActionButton fab_item;
  long todoId=-1;
  ItemActivity activity;
  DBHandler dbHandler;
  ItemTouchHelper touchHelper;
  ItemAdapter adapter;
  ArrayList<ToDoItem>list;
  @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_item);
    item_toolbar=findViewById(R.id.item_toolbar);
    rv_item=findViewById(R.id.rv_item);
    fab_item=findViewById(R.id.fab_item);
    setSupportActionBar(item_toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setTitle(getIntent().getStringExtra(INTENT_TODO_NAME));
    todoId=getIntent().getLongExtra(INTENT_TODO_ID, -1);
    activity=this;
    dbHandler=new DBHandler(activity);
    rv_item.setLayoutManager(new LinearLayoutManager(activity));
    fab_item.setOnClickListener(new View.OnClickListener() {
      @Override public void onClick(View v) {
        AlertDialog.Builder dialog=new AlertDialog.Builder(activity);
        dialog.setTitle("Add ToDo item");
        View view=getLayoutInflater().inflate(R.layout.dialog_dashboard, null);
        final EditText toDoName=view.findViewById(R.id.ev_todo);
        dialog.setView(view);
        dialog.setPositiveButton("Add", new DialogInterface.OnClickListener() {
          @Override public void onClick(DialogInterface dialog, int i) {
            if (toDoName.getText().toString().length() > 0) {
              ToDoItem item=new ToDoItem();
              item.setItemName(toDoName.getText().toString());
              item.setToDoId(todoId);
              item.setCompleted(false);
              dbHandler.addToDoItem(item);
              refreshList();
            }
          }
        }
        );
        dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
          @Override public void onClick(DialogInterface dialogInterface, int i) {}
        }
        );
        dialog.show();
      }
    }
    );
    touchHelper=new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0) {
      @Override public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder p1, @NonNull RecyclerView.ViewHolder p2) {
        int sourcePosition=p1.getAdapterPosition();
        int targetPosition=p2.getAdapterPosition();
        Collections.swap(list, sourcePosition, targetPosition);
        adapter.notifyItemMoved(sourcePosition, targetPosition);
        return true;
      }
      @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {}
    }
    );
    touchHelper.attachToRecyclerView(rv_item);
  }
  @Override public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()==android.R.id.home) {
      finish();
      return true;
    }
    else return super.onOptionsItemSelected(item);
  }
  @Override protected void onResume() {
    refreshList();
    super.onResume();
  }
  void refreshList() {
    list=dbHandler.getToDoItems(todoId);
    adapter=new ItemAdapter(activity);
    rv_item.setAdapter(adapter);
  }
  void updateItem(final ToDoItem item) {
    AlertDialog.Builder dialog=new AlertDialog.Builder(activity);
    dialog.setTitle("Update ToDo Item");
    View view=getLayoutInflater().inflate(R.layout.dialog_dashboard, null);
    final EditText toDoName=view.findViewById(R.id.ev_todo);
    toDoName.setText(item.getItemName());
    dialog.setView(view);
    dialog.setPositiveButton("Update", new DialogInterface.OnClickListener() {
      @Override public void onClick(DialogInterface dialogInterface, int i) {
        if (toDoName.getText().toString().length() > 0) {
          item.setItemName(toDoName.getText().toString());
          item.setToDoId(todoId);
          item.setCompleted(false);
          dbHandler.updateToDoItem(item);
          refreshList();
        }
      }
    }
    );
    dialog.show();
  }
  class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {
    ItemActivity activity;
    ItemAdapter(ItemActivity activity) {
      this.activity=activity;
    }
    @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
      return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.rv_child_item, viewGroup, false));
    }
    @Override public void onBindViewHolder(@NonNull final ViewHolder holder, final int i) {
      holder.itemName.setText(list.get(i).getItemName());
      holder.itemName.setChecked(list.get(i).isCompleted());
      holder.itemName.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View view) {
          list.get(i).setCompleted(!list.get(i).isCompleted());
          activity.dbHandler.updateToDoItem(list.get(i));
        }
      }
      );
      holder.delete.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View v) {
          AlertDialog.Builder dialog=new AlertDialog.Builder(activity);
          dialog.setTitle("Are you sure");
          dialog.setMessage("Do you want to delete this item?");
          dialog.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
            @Override public void onClick(DialogInterface dialogInterface, int pos) {
              activity.dbHandler.deleteToDoItem(list.get(i).getId());
              activity.refreshList();
            }
          }
          );
          dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override public void onClick(DialogInterface dialogInterface, int i) {}
          }
          );
          dialog.show();
        }
      }
      );
      holder.edit.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View view) {
          activity.updateItem(list.get(i));
        }
      }
      );
      holder.move.setOnTouchListener(new View.OnTouchListener() {
        @Override public boolean onTouch(View view, MotionEvent motionEvent) {
          if (motionEvent.getActionMasked()==MotionEvent.ACTION_DOWN) {
            activity.touchHelper.startDrag(holder);
          }
          return false;
        }
      }
      );
    }
    @Override public int getItemCount() {
      return list.size();
    }
    class ViewHolder extends RecyclerView.ViewHolder {
      CheckBox itemName;
      ImageView edit;
      ImageView delete;
      ImageView move;
      ViewHolder(View v) {
        super(v);
        itemName=v.findViewById(R.id.cb_item);
        edit=v.findViewById(R.id.iv_edit);
        delete=v.findViewById(R.id.iv_delete);
        move=v.findViewById(R.id.iv_move);
      }
    }
  }
}

当我单击任务添加子任务时,应用程序停止工作并立即关闭,显示我附加的以下错误。

我想通过单击主任务来添加子任务,但我无法做到这一点。我怎样才能做到这一点?

我已将 FloatingActionButton 声明为 fab_item 并写道:

fab_item = findViewById(R.id.fab_item); 

在onCreate下的onClick之前。

最佳答案

将其声明为您的类属性:

FloatingActionButton fab_item = findViewById(R.id.fab_item);

不要在 onCreate() 中初始化 fab_item,而是尝试在类定义中初始化它.

关于java - 我想在单击任务时添加子任务,但是当我单击任务时出现以下错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61396348/

相关文章:

java - 为 tar.gz 等特殊情况获取文件扩展名

java - Jackson 和泛型类型引用

java - 将 sourcesJar 任务添加到自定义 Gradle 插件

android - 使用 Gradle 构建时获取类缓存错误

java - Facebook 登录不起作用,我忘记了什么?

java - 欧拉计划 #3 Java

java - 文本文件、图片、声音文件和视频文件都是以字节流的形式存储/传输的吗?

javascript - 点击时 HTML5/Android 覆盖

android - 华为云数据库创建对象类型()崩溃

java - 如何启动 RecentApplicationsDialog?