Почему я не могу сделать свой индикатор выполнения невидимым в моем приложении Android Kotlin? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть фрагмент, содержащий код для включения и выключения счетчика индикатора выполнения, но счетчик не выключается, когда это необходимо. Мой XML файл содержит представление списка и счетчик.

Вот мой фрагмент кода:

package com.riverstonetech.gositeuk.ui.england

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ProgressBar
import androidx.fragment.app.Fragment
import com.google.firebase.firestore.FirebaseFirestore
import com.riverstonetech.gositeuk.CountiesActivity
import com.riverstonetech.gositeuk.CountriesActivity
import com.riverstonetech.gositeuk.MainActivity
import com.riverstonetech.gositeuk.R
import kotlinx.android.synthetic.main.fragment_england.*

class EnglandFragment : Fragment() {

    // Access a Cloud Firestore instance from your Activity
    val db = FirebaseFirestore.getInstance()
    lateinit var adapter: ArrayAdapter<String>

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.fragment_england, container, false)

        (requireActivity() as CountriesActivity).initializeCustomActionBar(
            R.drawable.england_flag,
            R.string.title_counties
        )

        var counties: ArrayList<String>

        val docRef = db.collection("UKSites").document("England")

        val progressBar = activity!!.findViewById<ProgressBar>(R.id.countiesLoadingProgressBar)

        docRef.get()
            .addOnSuccessListener { document ->

                progressBar?.visibility = ProgressBar.VISIBLE

                if (document != null) {

                    counties = document.get("Counties") as ArrayList<String>

                    adapter = ArrayAdapter(requireContext(), R.layout.list_item, counties)

                    countiesListView.adapter = adapter

                    countiesListView.setOnItemClickListener { parent, view, position, id ->

                        val intent = Intent(activity!!, CountiesActivity::class.java)
                        intent.putExtra("COUNTY", counties[position])
                        startActivity(intent)

                    }

                    progressBar?.visibility = ProgressBar.GONE

                } else {
                    Log.d("Debug", "No such document")
                }
            }
            .addOnFailureListener { exception ->
                Log.d("Debug", "get failed with ", exception)
            }


        return root
    }

}

А вот мой XML код

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/countiesListView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="60dp"
        android:headerDividersEnabled="false"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </ListView>

    <ProgressBar
        android:id="@+id/countiesLoadingProgressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:indeterminateTint="#FFFFFF"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Я чувствую, что это как-то связано с присутствием представления списка и тем фактом, что у меня есть фрагмент, а не действие.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Проблема здесь:

val progressBar = activity!!.findViewById<ProgressBar>(R.id.countiesLoadingProgressBar)

Это будет поиск Иерархии вида деятельности *1007* для вашего индикатора выполнения. Поскольку действие не содержит этого представления, возвращаемое значение будет нулевым. Это нулевое значение не вызывает cra sh, потому что вы используете нулевую обработку, когда фактически пытаетесь получить к нему доступ:

progressBar?.visibility = ProgressBar.VISIBLE

Если вы вместо этого напишите это:

val progressBar: ProgressBar = root.findViewById(R.id.countiesLoadingProgressBar)

Вы получаете два преимущества:

  1. Вы просматриваете иерархию просмотра фрагмента для индикатора выполнения (так что вы действительно его найдете).
  2. Указывая тип явно (: ProgressBar), вы утверждаете, что возвращаемое значение никогда не будет нулевым. Если это так, ваше приложение будет sh. Но мы (как люди) знаем, что представление находится во фрагменте, поэтому это никогда не подведет. Это полезно, потому что это означает, что, если вы каким-то образом получаете cra sh, то невероятно очевидно, в чем проблема (root не содержит представления с идентификатором countiesLoadingProgressBar).

Подробнее об этой явной типизации можно прочитать здесь: https://kotlinlang.org/docs/reference/java-interop.html#null -safety-and-platform-types

0 голосов
/ 06 февраля 2020

Используется val progressBar: ProgressBar = root.findViewById<ProgressBar>(R.id.countiesLoadingProgressBar) вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...