【问题标题】:How to prevent "Provided document path must not be null." Firestore?如何防止“提供的文档路径不能为空”。火库?
【发布时间】:2019-10-02 02:12:56
【问题描述】:

当我想 onBackPressed 移动到上一个活动 (ViewData.class) 时遇到问题,但我不能这样做。有解决问题的方法吗?问题是:

 Caused by: java.lang.NullPointerException: Provided document path must not be null.
    at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:906)
    at com.google.firebase.firestore.CollectionReference.document(com.google.firebase:firebase-firestore@@21.1.1:103)
    at id.MuhammadRafi.StockCount.ViewData.onStart(ViewData.java:200)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236)
    at android.app.Activity.performStart(Activity.java:6006)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288)

ViewData.java:

@Override
protected void onStart() {
    super.onStart();

    documentID = getIntent().getStringExtra("documentID");

    collectionReference.document(documentID).collection("Products").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if(task.isSuccessful()) {

                itemsList.clear();

                for(DocumentSnapshot documentSnapshot : task.getResult()) {
                    Items items = documentSnapshot.toObject(Items.class);
                    itemsList.add(items);

                    productListAdapter.notifyDataSetChanged();
                }
            }
        }
    });
}

MainActivity.java:

public void onBackPressed() {
    Intent moveView = new Intent(ScanActivity.this, ViewData.class);
    startActivity(moveView);
    finish();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

【问题讨论】:

  • 请仅使用android-studio 标签来回答有关 Android Studio IDE 本身的问题。对于一般的 Android 编程问题,请使用android 标签。
  • 对不起,我下次再做。感谢关注:)

标签: java android google-cloud-firestore


【解决方案1】:

如果你想回到之前的活动,不需要

startActivity(moveView);
finish();

在您的onBackPressed() 中。您正在做的是启动该活动的另一个实例并发送您想要发回的数据。

改为在您的ViewData.classonBackPressed()MainActivity 中执行startActivityForResult()

public void onBackPressed() {
    Intent moveView = getIntent();
    //Here your can add whatever values you want to send back to your activity
    moveView.putExtra("some_key",value)
    setResult(Activity.RESULT_OK,moveView);
    finish();
}

然后在您的ViewData.class 覆盖onActivityResult() 中,您将在其中检索当前活动发送的数据。见Getting a Result from an Activity 您在使用 Firestore 时遇到的问题是您没有使用正确的路径进行初始化,可能是因为您正在启动 ViewData.class 的新实例

【讨论】:

  • 对了,ViewData.class中的moveView.putExtra已经在RecyclerView类中声明了。我只想回到从 MainActivity,class 到 ViewData.class 的上一个活动。我认为错误是 ViewData.class 在我单击 onBackPressed 时需要 documentID
  • @Mr.Robot 顺便说一句,您是否检查了我在答案中发布的链接?,当我说您没有返回以前的活动而是您正在创建时,您是否理解部分一个新的实例?
【解决方案2】:

NullPointerException:提供的文档路径不能为空

上面的错误是由这一行引起的:

documentID = getIntent().getStringExtra("documentID");

这里 documentID 为空。

要回到以前的活动,只需删除 onBackPressed 方法或将其覆盖为:

@Override
public void onBackPressed() {
    super.onBackPressed();
}

并在您当前活动的 onCreate() 中添加此行以使导航返回图标正常工作 -

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

【讨论】:

  • 示例:我有 3 个活动。当我像在活动 3 上那样更改 onBackPressed 时,它是返回活动 1 而不是返回活动 2
  • 当你从活动 2 开始活动 3 时,不要使用 finish();
猜你喜欢
  • 2019-02-28
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多