Ящик навигации TextView Nullpointer исключение - PullRequest
0 голосов
/ 20 января 2020

У меня есть TextView в навигационной панели моего приложения. При первоначальной загрузке соответствующего xml, TextView (с отображением имени и фамилии пользователя) работает без ошибок. Однако после перехода к следующему действию и немедленного возврата к предыдущему действию приложение вылетает с NullPointerException. Почему он успешно загружается изначально, но падает при переходе назад? Я поставил нулевую проверку, но это просто устанавливает TextView в пустое значение, но предотвращает сбой.

Мой заголовок навигации xml:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

<ImageView
    android:id="@+id/imageView2"
    android:layout_width="match_parent"
    android:layout_height="117dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    app:srcCompat="@drawable/logo" />


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal">

<TextView
    android:id="@+id/textView15"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="20dp"
    android:textSize="24sp" />

<TextView
    android:id="@+id/textView40"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="24sp" />

</LinearLayout>

</LinearLayout>

Часть макета xml, где я ссылаюсь на заголовок навигации:

<com.google.android.material.navigation.NavigationView
    android:id="@+id/mydeals_seller_nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/navigation_header"
    android:fitsSystemWindows="true"

    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:menu="@menu/seller_menu"/>

Ссылка TextView в упражнении:

    docref = FirebaseFirestore.getInstance()
    docref.collection("Users").whereEqualTo("uid", userid).get()
        .addOnSuccessListener { value->

            if (value != null ) {
                for (document in value!!) {

                    val user_name = document.getString("name")!!
                    val user_surname = document.getString("surname")!!

                    if(textView15 != null || textView40 != null){

                        menu_name = findViewById(R.id.textView15)!!
                        menu_surname = findViewById(R.id.textView40)!!

                        menu_name.setText("$user_name ")
                        menu_surname.setText(user_surname)
                    }


                }
            } else {

                Log.d("Firestore_error", "No Data")
            }

        }    

Нужен ли отдельный заголовок навигации и TextView для каждое действие?

Редактировать При дальнейшем тестировании API 22 эта проблема не возникает. Есть предложения?

Ответы [ 4 ]

0 голосов
/ 30 января 2020

После большого количества проб и ошибок кажется, что ошибка была проблемой запроса Firestore. основываясь на моем запросе выше, я использовал al oop, где userid id соответствует идентифицированному пользователю. по некоторым причинам при перемещении между действиями это приводило к нулевому указателю. я понятия не имею, почему, но изменение запроса выше на одно чтение, как показано ниже, решило проблему:

docref = FirebaseFirestore.getInstance()
docref.collection("Users").document(userid).get()
    .addOnSuccessListener { value->

        if (value != null ) {

                val user_name = value.getString("name")!!
                val user_surname = value.getString("surname")!!

                if(textView15 != null || textView40 != null){

                    menu_name = findViewById(R.id.textView15)!!
                    menu_surname = findViewById(R.id.textView40)!!

                    menu_name.setText("$user_name ")
                    menu_surname.setText(user_surname)
                }

        } else {

            Log.d("Firestore_error", "No Data")
        }

    }

Точно так же, не более NullPointerException. было бы здорово, если бы эксперт Firestore мог объяснить, почему это происходит.

0 голосов
/ 20 января 2020

Вместо вызова findViewById в представлении активности вы должны вызывать его в представлении заголовка следующим образом:

docref.collection("Users").whereEqualTo("uid", userid).get()
    .addOnSuccessListener { value->
        if (value != null ) {
            for (document in value!!) {

                val user_name = document.getString("name")!!
                val user_surname = document.getString("surname")!!

                    // This gets the first header that is attached to the 
                    // navigation view
                    val header = mydeals_seller_nav_view.getHeaderView(0)

                    menu_name = header.findViewById(R.id.textView15)!!
                    menu_surname = header.findViewById(R.id.textView40)!!

                    menu_name.setText("$user_name ")
                    menu_surname.setText(user_surname)
                }


            }
        } else {

            Log.d("Firestore_error", "No Data")
        }

    } 

Надеюсь, это исправит вашу проблему

0 голосов
/ 21 января 2020

Пожалуйста, попробуйте это ... Вы должны сохранить эти значения в предпочтениях и установить значения предпочтений для textview или инициализировать firbase.instance в методе onResume ().

0 голосов
/ 20 января 2020
  menu_name = findViewById(R.id.textView15)!!
                    menu_surname = findViewById(R.id.textView40)!!

                    menu_name.setText("$user_name ")
                    menu_surname.setText(user_surname)

Замените эти строки этими:

val headerView = mydeals_seller_nav_view.getHeaderView(0)
val menu_name = headerView.textView15
val menu_surname = headerView.textView40

menu_name.setText("$user_name ")
menu_surname.setText(user_surname)
...