布局XML中的字符串格式的数据绑定

问题描述

在我的android应用中,我有一个Seekbar,允许用户选择半径。在移动搜索栏的滑块时,我希望文本视图显示搜索栏的当前值。

在我的片段中,我听了seekbar的变化并相应地更新了我的viewmodel。但是,textview中的radius值不会改变。调试时,我注意到我的视图模型searchOffers.searchQuery没有附加任何侦听器。 android:text="@{@string/searchRadius(searchOffers.searchQuery.radiusInKm)}"是否不向searchQuery添加侦听器?

在侦听搜索栏更改时,我已经手动设置了textview字符串,这是可行的。但是我不明白为什么其他解决方案(看起来更优雅,更易读)不起作用。有人知道为什么还是什么合适的解决方案?

请注意,我只包含了代码的相关部分。使用视图模型的不同部分。

我要格式化的字符串是<string name="searchRadius">Radius: %s km</string>

我的fragment_layout.xml:

<layout xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="searchOffers"
            type="com.example.SearchOffersviewmodel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/radius_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{@string/searchRadius(searchOffers.searchQuery.radiusInKm)}"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <SeekBar
            android:id="@+id/radius_seekbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:max="30"
            android:paddingTop="15dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/radius_text" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

我的viewmodel:

class SearchOffersviewmodel : viewmodel() {
    val searchQuery = mutablelivedata<ProductSearchQuery>()
}

class ProductSearchQuery {
    var radiusInKm: Int = 0
}

我的片段:

class MyFragment() : Fragment(),OnSeekBarchangelistener {
    private lateinit var viewmodel: SearchOffersviewmodel
    private lateinit var binding: FragmentLayoutBinding

    override fun onCreateView(
        inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    ): View? {
        viewmodel = viewmodelProvider(requireActivity()).get(SearchOffersviewmodel::class.java)
        binding = DataBindingUtil.inflate(inflater,R.layout.fragment_layout,container,false)
        binding.searchOffers = viewmodel
        binding.radiusSeekbar.setonSeekBarchangelistener(this)
        binding.radiusSeekbar.progress = viewmodel.searchQuery.value!!.radiusInKm

        return binding.root
    }

    override fun onProgressChanged(seekbar: SeekBar,progress: Int,fromUser: Boolean) {
        // I Could update the text here manually and then do
        // binding.radius_text.text = resources.getString(R.string.searchRadius).format(progress)
        // viewmodel.searchQuery.value!!.radiusInKm = progress
        
        val query = viewmodel.searchQuery.value!!
        query.radiusInKm = progress
        viewmodel.searchQuery.value = query
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)