【问题标题】:Access layout TextView without data binding or findViewById()?在没有数据绑定或 findViewById() 的情况下访问布局 TextView?
【发布时间】: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 合成。问题是什么?

标签: android kotlin


【解决方案1】:

要更改TextView 的属性,如其文本,您需要直接或间接引用TextView

要获得对TextView 的引用,您需要使用ViewBindingDataBindingfindViewById() 或其同级函数,例如findViewByTag()

您也可以使用Kotlin Synthetics,就像您在示例中所做的那样,在我看来,由于this article 中解释的原因,这不是一个好的做法。

【讨论】:

  • 感谢您的详细回答和链接。我会阅读它并肯定会改变我的做法以避免不良做法!谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 2013-04-01
  • 2017-11-02
  • 2010-12-12
相关资源
最近更新 更多