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
AppCompatActivityversComponentActivity. 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?