【问题标题】:My Android app crashes when I use method from MainActivity in an other Activity当我在另一个 Activity 中使用 MainActivity 中的方法时,我的 Android 应用程序崩溃了
【发布时间】:2015-07-13 22:35:21
【问题描述】:

我有两个活动MainActivity 和Additem

在 MainActivity 我有这个方法:

public void updateUI() {
    helper = new TaskDBHelper(MainActivity.this);
    SQLiteDatabase sqlDB = helper.getReadableDatabase();
    Cursor cursor = sqlDB.query(TaskContract.TABLE,
            new String[]{TaskContract.Columns._ID, TaskContract.Columns.TASK},
            null,null,null,null,null);

    listAdapter = new SimpleCursorAdapter(
            this,
            R.layout.task_view,
            cursor,
            new String[] { TaskContract.Columns.TASK},
            new int[] { R.id.taskTextView},
            0
    );

    ListView listView = (ListView)findViewById(R.id.list);
    listView.setAdapter(listAdapter);

}

它会更新Mainscreen 上的tasklist。

但是当我使用updateUI();在Additem 中,保存任务时它会返回,但应用程序崩溃并会自行重启。

作为错误我得到了这个:

原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)'

这是我在 Additem 中使用 updateUI() 的代码:

public void saveItem(View view){
    EditText editText = (EditText)findViewById(R.id.editText);
    String task = editText.getText().toString();
    Log.d("Additem", task);

    helper = new TaskDBHelper(Additem.this);
    SQLiteDatabase db = helper.getWritableDatabase();
    ContentValues values = new ContentValues();

    values.clear();
    values.put(TaskContract.Columns.TASK, task);

    db.insertWithOnConflict(TaskContract.TABLE, null, values,
            SQLiteDatabase.CONFLICT_IGNORE);



    updateUI();


    finish();
}

有人可以帮我解决这个问题吗?

提前致谢,

亲切的问候,赛琳

【问题讨论】:

  • 请发布崩溃的日志(或检查一下,您就会知道..),以便了解导致它的原因和原因
  • 感谢您的建议我编辑了我的问题:)
  • 你的listView在你调用方法的那一刻不存在。这是因为该活动未处于活动状态并且已被回收以节省内存。你不应该从 Activity 之外更新 UI。
  • 显示你在哪里调用这个函数
  • @AdnanElezovic 谢谢!但是当应用返回主屏幕时,它不会显示列表的最后一个版本。

标签: java android android-studio


【解决方案1】:

您的列表视图为空,当您从其他活动 [当 MainActivity 暂停/停止时] 调用它时,您实际上正在执行导致崩溃的 null.setAdapter。

您应该向 MainActivity 发布某种事件并在 MainActivity 恢复时更新列表/适配器。或者您可以随时刷新/更新 MainActivity 的 onCreate/onResume 中的适配器。

【讨论】:

    【解决方案2】:

    我建议您在 MainActivity 中初始化 listView 和 listAdapter 并在更新 UI 中使用

    listAdapter.notifyDataSetChanged()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 2020-02-07
      相关资源
      最近更新 更多