提问者:小点点

为什么aFragment中的一个属性(它在显示对话框后位于ViewPager中)不再初始化了?


正如你在图片中看到的,我有一个表布局和一个视图页。

我有一个片断用于产品,一个用于类别。在我的onViewCreated方法中,我将progressBar设置为可见。在访问progressBar之前,在onViewCreated方法中初始化progressBar属性。

正如您在图像中看到的,ProgressBar被成功地设置为Visible。产品被加载,然后ProgressBar再次被设置为不可见。

当我按下浮动操作按钮时,我打开了一个对话框,它扩展了DialogFragment类。

包含TabView和ViewPager的Main类正在实现ProductDialog.ProductDialogEventListener。这意味着,当我点击save按钮时,在Main类中调用onProductAdded方法。

但是,此方法正在调用productFragment类中的一个方法,以便将新产品添加到片段内部的列表中。当ProgressBar设置为现在可见时,由于ProgressBar属性未初始化,I将收到一个UninitializedPropertyAccessException。

我不明白,因为我之前已经初始化并使用过了。

下面是一些代码:

ProductDialog:


class ProductDialog : DialogFragment() {

    lateinit var editTextTitle: EditText
    lateinit var editTextSpecialText: EditText
    lateinit var editTextDescription: EditText
    lateinit var radioButtonMen: RadioButton
    lateinit var radioButtonWomen: RadioButton
    lateinit var radioButtonUnisex: RadioButton
    lateinit var productDialog: AlertDialog
    lateinit var productDialogEventListener: ProductDialogEventListener
    lateinit var apiOperations: ApiOperations

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = AlertDialog.Builder(activity)
        val inflater = requireActivity().layoutInflater
        val view = inflater.inflate(R.layout.layout_product_dialog,null)
        builder.setView(view)
            .setTitle("Produkt erstellen")
            .setPositiveButton("Speichern") { _, _ -> saveProductRequest()}
            .setNegativeButton(R.string.cancel) { _, _ ->
                dialog.cancel()
            }
        setViews(view)
        setValues(view)
        productDialog = builder.create()
        return productDialog
    }

    interface ProductDialogEventListener{
        val onProductAdded: (variant:Product)->Unit
    }

    override fun onAttach(context: Context?) {
        super.onAttach(context)
        try {
            productDialogEventListener = context as ProductDialogEventListener
        }catch (exception: ClassCastException){
            throw exception
        }
    }

    private fun onProductSaved(id:String){
        productDialogEventListener.onProductAdded(Product(id.toInt(),editTextTitle.text.toString(),editTextSpecialText.text.toString(),editTextDescription.text.toString(),getCheckedGender()))
    }

主要activity(概览活动)


import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.design.widget.TabLayout
import android.support.design.widget.TabLayout.OnTabSelectedListener
import android.support.v4.app.Fragment
import android.support.v4.view.ViewPager
import android.view.View
import android.widget.ListView
import android.widget.ProgressBar
import android.widget.TableLayout
import android.widget.Toast

class OverviewActivity : AppCompatActivity(), ProductDialog.ProductDialogEventListener, CategoryDialog.CategoryDialogListener {
    private lateinit var listViewCategories: ListView
    private lateinit var apiOperations: ApiOperations
    private lateinit var progressBarCategories: ProgressBar
    private lateinit var addCategoryButton: FloatingActionButton
    private lateinit var tabLayout: TabLayout
    private lateinit var viewPager : ViewPager
    private var categories = ArrayList<Category>()
    private val productsFragment = ProductsFragment()
    private val categoriesFragment = CategoriesFragment()

    override fun onResume() {
        super.onResume()
        setCategories()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_overview)
        setViews()
        setViewPager()
        setValues()
    }

    private fun setViews(){
        listViewCategories = findViewById(R.id.listViewCategories)
        addCategoryButton = findViewById(R.id.add_category_button)
        progressBarCategories = findViewById(R.id.progressCategories)
        viewPager = findViewById(R.id.viewPager)
        tabLayout = findViewById(R.id.tabLayout)
    }

    private fun setViewPager(){
        val fragmentList = listOf(productsFragment,categoriesFragment)
        val overViewPageViewAdapter = OverViewPageViewAdapter(supportFragmentManager,tabLayout.tabCount)
        viewPager.adapter = overViewPageViewAdapter
        viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout))
        tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener{
            override fun onTabReselected(p0: TabLayout.Tab?) {
            }

            override fun onTabUnselected(p0: TabLayout.Tab?) {
            }

            override fun onTabSelected(tab: TabLayout.Tab) {
                viewPager.currentItem = tab.position
            }
        })
    }

    private fun setValues(){
        apiOperations = ApiOperations(applicationContext)
    }

    private fun setProgressBarVisible(visible: Boolean, progressBar: ProgressBar){
        when(visible){
            true -> progressBar.visibility = View.VISIBLE
            else -> progressBar.visibility = View.GONE
        }
    }

    fun addNewProductButtonClicked(view:View){
        val dialog = ProductDialog()
        dialog.show(supportFragmentManager,"New Product")
    }
    
    override val onProductAdded: (product: Product) -> Unit
        get() = {product ->
            productsFragment.onProductAdded(product)
        }
    }

最后是productFragment类

import android.content.Intent
import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ListView
import android.widget.ProgressBar
import android.widget.Toast

class ProductsFragment :Fragment(){

    lateinit var apiOperations: ApiOperations
    lateinit var listViewProducts: ListView
    lateinit var addProductButton: FloatingActionButton
    lateinit var progressBar: ProgressBar
    private var products = ArrayList<Product>()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.products_fragment_layout,container,false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        apiOperations = ApiOperations(view.context)
        setViews(view)
        setProducts(view)
    }


    private fun setViews(view: View){
        listViewProducts = view.findViewById(R.id.listViewProducts)
        addProductButton = view.findViewById(R.id.add_product_button)
        progressBar = view.findViewById(R.id.progress_circular)
    }

    private fun updateProductList(view: View,newList:ArrayList<Product>){
        Toast.makeText(context,"settingProgressbar visible",Toast.LENGTH_SHORT).show()
        setProgressBarVisible(true)
        products = newList
        listViewProducts.adapter = ProductListViewAdapter(view,
            products,::deleteProduct)
        listViewProducts.setOnItemClickListener{ _, _, position, _ ->
            val product: Product = listViewProducts.adapter.getItem(position) as Product
            openProductActivity(product)
        }
        setProgressBarVisible(false)
    }


    private fun setProducts(view: View){
        setProgressBarVisible(true)
        apiOperations.getProducts(
            { newList -> updateProductList(view,newList)},
            {
                setProgressBarVisible(false)
                Toast.makeText(context,"Produkte konnten nicht geladen werden!",Toast.LENGTH_SHORT).show()
            }
        )
    }

    fun addNewProductButtonClicked(view:View){
        val dialog = ProductDialog()
        dialog.show(fragmentManager,"New Product")
    }

    private fun deleteProduct(view: View,productId: Int){
        setProgressBarVisible(true)
        apiOperations.deleteProduct(productId,{
            products.removeAll { product -> product.id == productId }
            updateProductList(view,products)
            setProgressBarVisible(false)
            Toast.makeText(view.context,"Produkt wurde gelöscht!", Toast.LENGTH_SHORT).show()
        },
            {
                Toast.makeText(view.context, "Es ist ein Fehler aufgetreten!" , Toast.LENGTH_LONG).show()
                setProgressBarVisible(false)
            }
        )
    }

    private fun openProductActivity(product: Product){
        val intent = Intent(view?.context, ProductActivity::class.java)
        intent.putExtra("product",product)
        startActivity(intent)
    }

    private fun setProgressBarVisible(visible: Boolean){
        if(progressBar==null){
            progressBar = view!!.findViewById(R.id.progress_bar)
        }
        Toast.makeText(context,"setProgressbar called",Toast.LENGTH_SHORT).show()
        when(visible){
            true -> progressBar.visibility = View.VISIBLE
            else -> progressBar.visibility = View.GONE
        }
    }

     fun onProductAdded(product: Product) {
            setProgressBarVisible(true)
            products.add(product)
            Toast.makeText(context,products.size.toString(),Toast.LENGTH_SHORT).show()
            Toast.makeText(context,"Neues Produkt " + product.title + " hinzugefügt!",Toast.LENGTH_SHORT).show()
            setProgressBarVisible(false)
        }
}


共1个答案

匿名用户

您可以在您的activity中创建progressbar,而不是在您的片段中创建progressbar,然后从您的两个片段中访问progressbar。这样做,你就不会面对错误。