gpt4 book ai didi

android - 在没有数据绑定(bind)或 findViewById() 的情况下访问布局 TextView?

转载 作者:行者123 更新时间:2023-12-02 13:17:32 24 4
gpt4 key购买 nike

目前正在学习 Android 编程,更具体地说是 Kotlin(和 MVVM),我想知道如何访问我的 Activity 布局的 TextView。

事实上,我看到有两种众所周知的方法可以做到这一点,或者使用 findViewById() 或使用数据绑定(bind)。

我很惊讶我可以通过不做任何事情来更改 TextView 中的文本(至少我是这么认为的,我可能错了)。

您将在我的 Activity 代码下方找到我修改我的 TextView 的文本,从未创建 findViewById 并且从未在 setupView() 函数中创建绑定(bind)对象。

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]
}
}

您还将在我的 Activity 下方找到 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 合成

最佳答案

更改 TextView 的属性喜欢它的文字,您需要引用 TextView直接或间接。

要获得对 TextView 的引用您需要使用 ViewBinding , DataBinding , findViewById()或其兄弟函数,如 findViewByTag() .

您也可以使用Kotlin Synthetics ,正如您在示例中所做的那样,在我看来,这不是一个好的做法,因为 this article 中解释了原因。 .

关于android - 在没有数据绑定(bind)或 findViewById() 的情况下访问布局 TextView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62447434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com