【发布时间】:2020-06-18 10:02:08
【问题描述】:
目前正在学习 Android 编程,尤其是 Kotlin(和 MVVM),我想知道如何访问我的活动布局的 TextView。
确实,我看到有两种众所周知的方法可以做到这一点,使用 findViewById() 或使用数据绑定。
我很惊讶我可以通过不做任何事情来更改 TextView 中的文本(至少我是这么认为的,我可能错了)。
您将在我的活动代码下方找到我修改我的 TextView 的文本的地方,即从不创建 findViewById 并且从未在 setupView() 函数中创建绑定对象。
class MovieDetailActivity : AppCompatActivity() {
private lateinit var viewModel: MovieDetailViewModel;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_movie_detail)
val movieId = intent.getIntExtra("id",1) //TODO : ne plus mettre un id de film en brut mais celui qui sera cliqué sur la page home
val apiService : TMDBInterface = TMDBClient.getClient()
viewModel = getViewModel(apiService,movieId)
viewModel.movieDetails.observe(this, Observer {
setupView(it)
})
viewModel.networkState.observe(this, Observer {
activity_movie_detail_progress_bar.visibility = if (it == NetworkState.LOADING) View.VISIBLE else View.GONE
activity_movie_detail_error_text_view.visibility = if (it == NetworkState.ERROR) View.VISIBLE else View.GONE
})
}
fun setupView(movie : MovieDetails){
this.activity_movie_detail_title_text_view.text = movie.title
this.activity_movie_detail_overview_text_view.text = movie.overview
this.activity_movie_detail_release_text_view.text = movie.releaseDate
this.activity_movie_detail_vote_average_text_view.text = movie.voteAverage.toString()
this.activity_movie_detail_vote_number_text_view.text = movie.voteCount.toString()
val formatCurrencey = NumberFormat.getCurrencyInstance(Locale.FRANCE)
activity_movie_detail_budget_text_view.text = formatCurrencey.format(movie.budget)
val moviePosterURL = POSTER_BASE_URL + movie.posterPath
Glide.with(this)
.load(moviePosterURL)
.into(activity_movie_detail_scrollview_image_view)
}
/*
Méthode qui créer notre ViewModel
Ayant besoin de paramètres, on doit utiliser une ViewModel Factory et overide la méthode create
*/
private fun getViewModel(apiService:TMDBInterface, movieId:Int): MovieDetailViewModel {
return ViewModelProviders.of(this, object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return MovieDetailViewModel(apiService,movieId) as T
}
})[MovieDetailViewModel::class.java]
}
}
您还可以在我的活动下方找到 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"
tools:context=".presentation.activities.movieDetailActivity.MovieDetailActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ProgressBar
android:id="@+id/activity_movie_detail_progress_bar"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:visibility="gone"
/>
<TextView
android:id="@+id/activity_movie_detail_error_text_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/connection_problem"
android:visibility="gone"
/>
<ScrollView
app:layout_constraintTop_toTopOf="parent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/activity_movie_detail_scrollview_linear_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/activity_movie_detail_scrollview_image_view"
android:layout_width="match_parent"
android:layout_height="500dp"
android:layout_gravity="center"
android:scaleType="matrix"
/>
<LinearLayout
android:id="@+id/activity_movie_detail_info_linear_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="8dp">
<TextView
android:id="@+id/activity_movie_detail_title_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textColor="@android:color/black"
android:textSize="30sp"
android:textAlignment="center"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/activity_movie_detail_overview_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="italic"
android:textSize="12sp"
android:layout_marginTop="8dp"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/activity_movie_detail_info_complement_linear_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="8dp">
<TextView
android:id="@+id/activity_movie_detail_release_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/releaseDate"
android:textStyle="bold"
android:textColor="@android:color/black"
android:textSize="12sp"
/>
<TextView
android:id="@+id/activity_movie_detail_vote_average_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/vote_average"
android:textStyle="bold"
android:textColor="@android:color/black"
android:textSize="12sp"
/>
<TextView
android:id="@+id/activity_movie_detail_vote_number_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/vote_number"
android:textStyle="bold"
android:textColor="@android:color/black"
android:textSize="12sp"
/>
<TextView
android:id="@+id/activity_movie_detail_budget_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/budget"
android:textStyle="bold"
android:textColor="@android:color/black"
android:textSize="12sp"
/>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
我只是想知道没有这两种方法怎么可能访问?
编辑:感谢 EraftYps 和 René 的回答,我知道这是 Kotlin 合成
【问题讨论】:
-
它被称为 Kotlin 合成。问题是什么?