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>> { })
`
3 Réponses :
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
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})
veuillez également mentionner que c'est parce qu'il est déjà implémenté par défaut maintenant
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"
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
versComponentActivity
. 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?