viewModels()当我如下使用时
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
// ... more codes
}
Run Code Online (Sandbox Code Playgroud)
为什么它可以在
implementation 'androidx.fragment:fragment-ktx:1.3.0'
Run Code Online (Sandbox Code Playgroud)
相反,当我包含如下内容时,它们在其中不可用?
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
Run Code Online (Sandbox Code Playgroud)
我以为它应该在viewmodel-ktx图书馆而不是fragment-ktx图书馆
使用paging 3.0,我成功地实现了它。现在我想为其添加搜索功能。
我只是显示照片库以及分页功能。现在我想在有人搜索时使分页无效
但每当我在搜索上调用无效时。应用程序崩溃..
照片片段.kt
@AndroidEntryPoint
class PhotosFragment : BaseFragment<FragmentPhotosBinding,PhotosFragmentViewModel>(R.layout.fragment_photos),
SearchView.OnQueryTextListener, LifecycleObserver {
override val mViewModel: PhotosFragmentViewModel by viewModels()
private lateinit var photoAdapter: PhotoCollectionAdapter
override fun onAttach(context: Context) {
super.onAttach(context)
activity?.lifecycle?.addObserver(this)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
///mViewModel.setFilter(getString(R.string.search_filter_default_value))
initAdapter()
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreated(){
mViewModel.trendingPhotos.observe(viewLifecycleOwner, Observer {
photoAdapter.submitData(lifecycle,it)
})
}
private fun initAdapter() {
photoAdapter = PhotoCollectionAdapter()
photoAdapter.stateRestorationPolicy = RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY
mBinding.recyclerView.apply {
layoutManager = LinearLayoutManager(context)
setHasFixedSize(true)
adapter = photoAdapter
}
photoAdapter.addLoadStateListener { loadState -> …Run Code Online (Sandbox Code Playgroud) android kotlin android-viewmodel android-paging android-paging-3
我正在尝试在应用程序中实现架构组件,但我在创建androidViewModel实例时面临一个问题.请帮我解决这个问题.
这里我试图创建一个LoginViewModel类的实例,但得到下面提到的错误
错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.addonitservices.uphaar, PID: 22975
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.addonitservices.uphaar/com.addonitservices.uphaar.login.LoginActivity}: java.lang.RuntimeException: Cannot create an instance of class com.addonitservices.uphaar.login.LoginViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.addonitservices.uphaar.login.LoginViewModel
at android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:201)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
at com.addonitservices.uphaar.login.LoginActivity.initViewModel(LoginActivity.kt:27)
at com.addonitservices.uphaar.login.LoginActivity.onCreate(LoginActivity.kt:22)
at android.app.Activity.performCreate(Activity.java:6999)
at android.app.Activity.performCreate(Activity.java:6990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0) …Run Code Online (Sandbox Code Playgroud) android mvvm kotlin android-viewmodel android-architecture-components
我正在尝试对应该显示通过ViewModel中的LiveData属性公开的数据的视图进行数据绑定,但是我没有找到将LiveData中的对象绑定到视图的方法。从XML中,我只能访问LiveData实例的value属性,而不能访问其中的对象。我错过了什么吗?
我的ViewModel:
class TaskViewModel @Inject
internal constructor(private val taskInteractor: taskInteractor)
: ViewModel(), TaskContract.ViewModel {
override val selected = MutableLiveData<Task>()
val task: LiveData<Task> = Transformations.switchMap(
selected
) { item ->
taskInteractor
.getTaskLiveData(item.task.UID)
}
... left out for breivety ...
}
Run Code Online (Sandbox Code Playgroud)
我试图将任务对象的值绑定到我的视图中,但是当尝试在我的视图中设置任务的值时,我只能这样做android:text="@={viewmodel.task.value}"。我无权访问任务对象的字段。在LiveData对象中提取对象值的诀窍是什么?
我的任务课:
@Entity(tableName = "tasks")
data class Task(val id: String,
val title: String,
val description: String?,
created: Date,
updated: Date,
assigned: String?)
Run Code Online (Sandbox Code Playgroud) android android-databinding android-livedata android-viewmodel
我有以下ViewModel类:
class PersonViewModel(
context: Application,
private val dataSource: MoviesRemoteDataSource)
: AndroidViewModel(context) {
internal val compositeDisposable = CompositeDisposable()
val person: ObservableField<Person>()
private val isVisible = ObservableBoolean(false)
fun showPerson(personId: String) {
val personSubscription = dataSource.getPerson(personId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ person ->
isVisible.set(true)
this.person.set(person)
}
) { throwable -> Timber.e(throwable) }
compositeDisposable.add(personSubscription)
}
}
Run Code Online (Sandbox Code Playgroud)
这是Person类:
class Person(
@SerializedName("birthday")
var birthDay: String?,
@SerializedName("deathday")
var deathDay: String?,
var id: Int,
@SerializedName("also_known_as")
var alsoKnowAs: List<String>,
var biography: String,
@SerializedName("place_of_birth")
var placeOfBirth: String?)
Run Code Online (Sandbox Code Playgroud)
它在ViewModel的这一行显示错误:
val person: ObservableField<Person>()
Run Code Online (Sandbox Code Playgroud)
它说 …
根据https://developer.android.com/topic/libraries/architecture/viewmodel 上的“片段之间共享数据”部分,我们被告知在活动范围内创建一个 ViewModel 并在片段之间共享是要走的路.
这是在 ViewModel 中设置值的 Fragment
class MasterFragment : Fragment() {
private lateinit var itemSelector: Selector
private lateinit var model: SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
model = activity?.run {
ViewModelProviders.of(this).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
itemSelector.setOnClickListener { item ->
// Update the UI
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是使用属性集的细节片段
class DetailFragment : Fragment() {
private lateinit var model: SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
model = activity?.run {
ViewModelProviders.of(this).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
model.selected.observe(this, …Run Code Online (Sandbox Code Playgroud) 我现在正在学习 Android ViewModel。我有 MainActivity 和 RegisterActivity ,它们可以在其中输入姓名、年龄和电话号码。在 RegisterActivity 中输入该信息后,我将该信息放入 ViewModel 并单击一个按钮并完成 RegisterActivity。问题是,我想在 MainActivity 中显示信息。那么如何在两个活动之间共享 viewModel 呢?我必须使用什么概念?
class SettingsViewModelFactory(application: Application, owner: SavedStateRegistryOwner) : SavedStateViewModelFactory(application, owner){
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(SettingsViewModel::class.java)){
return SettingsViewModel() as T
}
throw IllegalArgumentException("Invalid ViewModel class")
}
}
Run Code Online (Sandbox Code Playgroud)
我在 SavedStateViewModelFactory 下方看到一条红色下划线,表示该类型是最终类型,不能继承。我该怎么办?文档太模糊了。另外我要在退货中放入什么状态?
我在 ViewPager 中有一个片段,其创建如下:
companion object {
fun newInstance(someData: SomeData): ViewPagerFragment {
val f = ViewPagerFragment()
val args = Bundle()
args.putParcelable("someData", someData)
f.arguments = args
return f
}
}
Run Code Online (Sandbox Code Playgroud)
它也是一个 Hilt 入口点,它创建自己的 ViewModel,但也需要父 Fragments ViewModel,因此该类的顶部如下所示:
@AndroidEntryPoint
class ViewPagerFragment : Fragment() {
private val parentViewModel: ParentViewModel by viewModels(
ownerProducer = { requireParentFragment() }
)
private val viewPagerViewModel: ViewPagerViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
但是,找不到父 Fragment:
java.lang.IllegalStateException: Fragment ViewPagerFragment{b6d6157}
(e5f3fc7d-2ae4-4275-9763-22826a9be939) id=0x7f09017e} is not a child Fragment, it is
directly attached to
dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper@1852444
Run Code Online (Sandbox Code Playgroud)
我认为发生这种情况是因为添加 viewPagerViewModel 后生成的 ViewPagerFragment …
android android-fragments android-viewpager android-viewmodel dagger-hilt
我在 jetpack compose 中创建了一个 LazyRow。在视图模型中的某个点,我想从该 LazyRow 获取当前可见项目的列表。我知道我可以使用以下代码获取 Composable 函数中可见项目的列表:
val listState = rememberLazyListState()
val visibleItemIds = remember {
derivedStateOf { listState.layoutInfo.visibleItemsInfo.map { it.key.toString() } }
}
Run Code Online (Sandbox Code Playgroud)
问题是如何在视图模型事件期间将此数据传递到视图模型(而不是单击按钮等)
android android-viewmodel android-jetpack-compose android-jetpack-compose-lazy-column
我有一个包含一个活动和两个片段的应用程序,在第一个片段中,我应该能够将数据插入数据库,在第二个片段中,我应该能够在 recyclerView 中看到添加的项目。
所以我制作了数据库、我的 RecyclerView 适配器和 ViewModel,
现在的问题是我应该如何管理这一切?
我应该在活动中初始化 ViewModel 并从片段中以某种方式调用它以使用插入吗?
我应该在两个片段中初始化视图模型两次吗?
我的代码如下所示:
让我们假设我在我的 Activity 中初始化了 viewholder:
class MainActivity : AppCompatActivity() {
private val articoliViewModel: ArticoliViewModel by viewModels {
ArticoliViewModelFactory((application as ArticoliApplication).repository)
}
}
Run Code Online (Sandbox Code Playgroud)
然后我的 FirstFragments 方法,我应该使用 viewModel 将数据添加到数据库中,如下所示:
class FirstFragment : Fragment() {
private val articoliViewModel: ArticoliViewModel by activityViewModels()
private fun addArticolo(barcode: String, qta: Int) { // function which add should add items on click
// here i should be able to do something like this
articoliViewModel.insert(Articolo(barcode, qta))
} …Run Code Online (Sandbox Code Playgroud) android ×11
kotlin ×6
android-architecture-components ×1
android-jetpack-compose-lazy-column ×1
dagger-hilt ×1
mvvm ×1