问题描述
在我的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 (将#修改为@)