6
votes

Le propriétaire du cycle de vie requis a trouvé l'activité

J'utilise la bibliothèque Android androidx.appcompat: appcompat: 1.0.2. Travailler sur un échantillon de gestionnaire de travail de codelabs. J'ai besoin d'obtenir des données en direct de ViewModel et j'utilise cette

import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.RadioGroup

import com.bumptech.glide.Glide

import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.work.WorkInfo

class BlurActivity : AppCompatActivity() {

    private var mViewModel: BlurViewModel? = null
    private var mImageView: ImageView? = null
    private var mProgressBar: ProgressBar? = null
    private var mGoButton: Button? = null
    private var mOutputButton: Button? = null
    private var mCancelButton: Button? = null

    /**
     * Get the blur level from the radio button as an integer
     * @return Integer representing the amount of times to blur the image
     */
    private val blurLevel: Int
        get() {
            val radioGroup = findViewById<RadioGroup>(R.id.radio_blur_group)

            return when (radioGroup.checkedRadioButtonId) {
                R.id.radio_blur_lv_1 ->  1
                R.id.radio_blur_lv_2 ->  2
                R.id.radio_blur_lv_3 ->  3
                else -> 1
            }
        }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_blur)

        // Get the ViewModel
        mViewModel = ViewModelProviders.of(this).get(BlurViewModel::class.java)

        // Get all of the Views
        mImageView = findViewById(R.id.image_view)
        mProgressBar = findViewById(R.id.progress_bar)
        mGoButton = findViewById(R.id.go_button)
        mOutputButton = findViewById(R.id.see_file_button)
        mCancelButton = findViewById(R.id.cancel_button)

        // Image uri should be stored in the ViewModel; put it there then display
        val intent = intent
        val imageUriExtra = intent.getStringExtra(Constants.KEY_IMAGE_URI)
        mViewModel!!.setImageUri(imageUriExtra)
        if (mViewModel!!.imageUri != null) {
            Glide.with(this).load(mViewModel!!.imageUri).into(mImageView!!)
        }

        mViewModel!!.getOutputWorkInfo()?.observe(this, Observer<List<WorkInfo>> {
            // If there are no matching work info, do nothing
            if (it == null || it.isEmpty()) return@Observer

            // We only care about the first output status.
            // Every continuation has only one worker tagged TAG_OUTPUT
            val workInfo = it[0]

            val finished = workInfo.state.isFinished
            if (!finished) showWorkInProgress() else showWorkFinished()
        })


        // Setup blur image file button
        mGoButton!!.setOnClickListener { view -> mViewModel!!.applyBlur(blurLevel) }
    }

    /**
     * Shows and hides views for when the Activity is processing an image
     */
    private fun showWorkInProgress() {
        mProgressBar!!.visibility = View.VISIBLE
        mCancelButton!!.visibility = View.VISIBLE
        mGoButton!!.visibility = View.GONE
        mOutputButton!!.visibility = View.GONE
    }

    /**
     * Shows and hides views for when the Activity is done processing an image
     */
    private fun showWorkFinished() {
        mProgressBar!!.visibility = View.GONE
        mCancelButton!!.visibility = View.GONE
        mGoButton!!.visibility = View.VISIBLE
    }
}

mais cette variable affiche une erreur - Non-correspondance de type. Obligatoire: propriétaire du cycle de vie. Trouvé: BlurActivity

J'ai cherché sur Google tout dit qu'il n'est pas nécessaire d'étendre le propriétaire du cycle de vie, par défaut, l'activité Appcompact implémente le propriétaire du cycle de vie.

Et j'ai aussi travaillé cela dans un autre projet, aucun problème trouvé. Je ne sais pas pourquoi j'obtiens cette erreur dans ce projet.

`

    mViewModel!!.getOutputWorkInfo()?.observe(this, Observer<List<WorkInfo>> {
 })

`


9 commentaires

Où utilisez-vous ce morceau de code? ceci doit être n'importe quel LifeCycleOwner (c'est-à-dire une activité ou un fragment)


activité, classe BlurActivity: AppCompatActivity ()


Essayez ce code: mViewModel !!. GetOutputWorkInfo () ?. observe (this @ BlurActivity, Observer > {})


même erreur en obtenant


C'est étrange. Dans la documentation, androidx AppCompatActivity n'implémente pas LifeCycleOwner, mais dans mon code (si j'ouvre ses sources), c'est le cas.


Ce sont deux pages différentes à ce sujet dans la documentation: developer.android.com/ reference / kotlin / androidx / appcompat / ap‌ p /… et developer.android.com/reference/androidx/appcompat/app/… . Premièrement, ne pas implémenter LifeCycleOwner et ensuite le fait. Mais le package est le même.


Oui, car il est déplacé de AppCompatActivity vers ComponentActivity . vérifiez ici developer.android.com/reference/androidx/activity/…


@JeelVankhede vous avez mal compris. Ses deux pages différentes pour la classe SAME dans le même package. Avec une description différente. L'un est LifecycleOwner, le second n'est pas.


Alors que diriez-vous de cette note de version: developer.android. com / jetpack / androidx / releases /… FIY, nous parlons de packages AndroidX , n'est-ce pas?


3 Réponses :


6
votes

Après avoir implémenté LifeCycleOwner dans l'activité principale, l'erreur se produit et fonctionne correctement

<₹Updated

Utilisez la dernière bibliothèque androidx et vous n'avez pas besoin d'implémenter LifecycleOwner. Maintenant, il est implémenté par défaut dans ComponentActivity que AppcompatActivity implémente


0 commentaires

13
votes

Même problème ici, j'ai donc dû mettre à jour ma dépendance androidx.appcompat, comme ci-dessous:

implementation 'androidx.appcompat:appcompat:1.1.0-alpha04'

pas besoin d'implémenter LifecycleOwner (comme implémenté par défaut maintenant {comme mentionné par Darthcow})


1 commentaires

veuillez également mentionner que c'est parce qu'il est déjà implémenté par défaut maintenant



1
votes

Ce problème se produit en cas de non-concordance entre les dépendances appcompat et Lifecycle .

Utilisez soit cet ensemble de dépendances:

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation "android.arch.lifecycle:extensions:$lifecycle_version"


0 commentaires