我有一个项目,在其中我已经成功实现了位置跟踪功能,并且运行良好。我每 30 秒使用融合位置提供程序跟踪用户当前位置。(跟踪在 MainActivity 启动时开始)。
现在我计划使用新引入的 Android 架构组件来更新该项目。但我不知道如何使用视图模型实现位置跟踪。在MainActivity 或 Application类中,哪里是开始位置跟踪的正确位置?我应该使用ViewModel 还是 AndroidViewModel?如何实现这一目标。
android fusedlocationproviderapi android-livedata android-viewmodel android-architecture-components
我知道为了将自定义参数传递给ViewModel,我们可以使用ViewModelProvider.NewInstanceFactory,如下所示:
// Factory Class
class MyFactory extends ViewModelProvider.NewInstanceFactory {
private final String mId;
public MyFactory(String id) {
mId = id;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
return (T) new MyViewModel(mId);
}
}
// MyViewModel class
class MyViewModel extends ViewModel {
public MyViewModel(String id) {
...
}
}
// Activity I can Initialise as:
MyFactory modelFactory = new MyFactory(id);
viewModel = ViewModelProviders.of(this, modelFactory).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)
如何使用AndroidViewModel子类中的自定义参数以及应用程序上下文来实现相同的效果。喜欢
// MyAndroidViewModel class
class MyAndroidViewModel …Run Code Online (Sandbox Code Playgroud) java android android-viewmodel android-architecture-components
想象一个 StackOverflow 问题的列表,这些问题可以单独被赞成和反对。他们每个人都有一个计数,显示其投票数。单击 upvote 将该计数加一,单击 downvote 将该计数减一。这就是我要实现的目标的总体思路。rv_item.xmlRecyclerView 中单个项目的布局(为简洁起见):
data>
<variable
name="item"
type="com.mycodez.Item"/>
<variable
name="vm"
type="com.mycodez.ListViewModel" />
</data>
<Button
android:id="@+id/decrease_quantity"
android:onClick="@{() -> vm.decrementItemQuantity(item)}"/>
<TextView
android:id="@+id/quantity"
android:text="@{String.valueOf(item.quantity)}"
tools:text="1" />
<Button
android:id="@+id/increase_quantity"
android:onClick="@{() -> vm.incrementItemQuantity(item)}"/>
Run Code Online (Sandbox Code Playgroud)
Where@+id/decrease_quantity类似于downvote,@+id/quantity类似于投票计数,@+id/increase_quantity类似于upvote。适配器:
class ListRvAdapter extends RecyclerView.Adapter<ListRvAdapter.ViewHolder> {
private List<Item> items;
private ListViewModel viewModel;
private LifecycleOwner lifecycleOwner;
ListRvAdapter(List<Item> items, ListViewModel viewModel, LifecycleOwner lifecycleOwner) {
this.items = items;
this.viewModel = viewModel;
this.lifecycleOwner = lifecycleOwner;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int …Run Code Online (Sandbox Code Playgroud) android android-databinding android-livedata android-viewmodel
我的应用程序在LinkageError使用lazy{}. 崩溃仅在以下情况发生:
minifyEnabledtrue在 build.gradle 中设置为,并且 lifecycle-2.0.0与minifyEnabled def lifecycle_version = '2.1.0'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
Run Code Online (Sandbox Code Playgroud)
此外,崩溃仅发生在其中一个视图模型上。在此之前触摸的同一活动中的其他视图模型不会使应用程序崩溃。
崩溃发生在这里的第二行:
private val searchStackViewModel by lazy {
ViewModelProviders.of(this)[SearchStateViewModel::class.java]
}
Run Code Online (Sandbox Code Playgroud)
该SearchStateViewModel是:
class SearchStateViewModel : ViewModel() {
// Live data that initialises to empty stack with SearchStack.init
private val privateStack = MutableLiveData<SearchStack>().apply {
value = SearchStack()
}
// Observable view of search stack so it can't be directly modified
internal val stateStack : LiveData<SearchStack> …Run Code Online (Sandbox Code Playgroud) android android-architecture-lifecycle android-viewmodel android-architecture-components android-jetpack
我正在研究 MVVM,看看它是否可以帮助我完成我即将进行的项目。到目前为止我所理解的是,我需要使用ViewModel来保存我的 UI 数据。我还需要使用 Repository 类来执行我对 WebServices 的所有请求,并且我正在使用 Volley 库。
所以这就是我所做的:
该视图模型
public class MyViewModel extends ViewModel {
private MyRepository repository;
private MutableLiveData<MyPojo> pojo;
public MyViewModel(MyRepository repository) {
this.repository = repository;
this.pojo = new MutableLiveData<>();
}
public LiveData<MyPojo> updatePojo(){
pojo.postValue(repository.getPojo());
return pojo;
}
}
Run Code Online (Sandbox Code Playgroud)
存储库类
public class MyRepository {
private Application application;
private LiveData<MyPojo> pojo;
public MyRepository(Application application) {
this.application = application;
}
public MyPojo getPojo(){
if(pojo == null){
ApiRequest apiRequest = new ApiRequest(ApiSingleton.getInstance(application).getRequestQueue(), application);
apiRequest.apiGetRequest(ApiRequest.MY_ENDPOINT, null, …Run Code Online (Sandbox Code Playgroud) 我正在使用像这里这样的共享视图模型
但问题是,当我清除最后一个片段时,我想清除视图模型,或者杀死它的实例,但是当我离开使用它的最后一个片段时,它以某种方式幸存下来
如何以编程方式清除此视图模型?
我像这样使用它
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated() {
model.getTotal().observe(viewLifecycleOwner, Observer { cartTotal ->
total = cartTotal
})
}
Run Code Online (Sandbox Code Playgroud)
从片段 BI 发送的总数
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated() {
model.setTotal = 10
}
Run Code Online (Sandbox Code Playgroud)
But when leaving Fragment A with that data (doing popBackStack since I'm using navigation components) it does not clear the viewmodel, instead when I open again my fragment , the data stills there
I …
android android-fragments kotlin android-viewmodel android-architecture-navigation
我发现自己为我创建的每个新片段编写样板代码。这包括设置视图模型和视图绑定,这是我的代码的 2 个不同部分,它们不相互依赖,因此其中之一的解决方案仍然很棒。
片段代码示例:
class MyFragment : Fragment() {
// View binding
private var _binding: FragmentMyBinding? = null
// View model
private lateinit var model : MyViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Model init
model = ViewModelProvider(this).get(MyViewModel::class.java)
//binding init
_binding = FragmentMyBinding.inflate(inflater, container, false)
return _binding!!.root
}
}
class MyViewModel : ViewModel()
Run Code Online (Sandbox Code Playgroud) android boilerplate kotlin android-viewmodel android-viewbinding
我是 Android 和 Java 新手,正在尝试制作基于位置的应用程序。
编辑
我制作了一个简单得多的测试代码并得到相同的错误。这是java:
package com.example.viewmodeltest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
public class MyViewModel extends ViewModel {
public int scoreTeamA = 0;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyViewModel locationViewModel = new ViewModelProvider(this).get(MyViewModel.class);
}
}
Run Code Online (Sandbox Code Playgroud)
我犯了同样的错误。这是我的应用程序级 build.gradle 中的依赖项:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
//dependencies for ViewModel, LiveData, etc.
def lifecycle_version = "2.2.0"
def …Run Code Online (Sandbox Code Playgroud) java android android-fusedlocation android-livedata android-viewmodel
在我的应用程序中,我有一个需要访问 ViewModel 的 MainActivity。我正在使用 DaggerHilt 和 @ViewModelInject 注释注入 ViewModel。此外,我在 Activity 中有两个 Fragment,它们需要访问同一个 ViewModel,以便使用 observable 相互传递数据。
问题:我发现每当我的一个 Fragment 通过onDestroy()它的 ViewModel 时就会被杀死。这让我认为 Activity 和 Fragment 没有共享同一个 ViewModel。
我的问题:有谁知道我们是否应该在 Dagger Hilt 中为 ViewModel 使用范围注释?我在 Hilt 文档或 android 开发教程/指南中没有看到这一点。我曾假设他们正在制作 ViewModels 应用程序级别的单例,这是有道理的。
如果我们必须为 ViewModel 使用范围注释,有没有人知道哪个级别合适?
这是我的视图模型代码:
class MainActivityViewModel @ViewModelInject constructor(
private val repo: Repo,
private val rxSharedPrefsRepo: RxSharedPrefsRepo,
private val resourcesRepo: ResourcesRepo,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
Run Code Online (Sandbox Code Playgroud) 不能从 Activity 使用“by viewModel”
我想为一个 Activity 注入一个 ViewModel,所以我尝试了这个。但它失败了,Android Studio 找不到它的参考。
private val mainViewModel: MainViewModel by viewModel()
Run Code Online (Sandbox Code Playgroud)
我的活动 extendsAppCompatActivity和 gradle 依赖项包括这些库:
implementation 'androidx.core:core-ktx:1.3.2'
def koin_version = '2.2.1'
implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-androidx-scope:$koin_version"
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
implementation "org.koin:koin-androidx-fragment:$koin_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$koin_version"
Run Code Online (Sandbox Code Playgroud)
我试过的:
下面的代码正在运行,但我想使用 Koin 2.2.0 的新默认“SavedStateHandle”功能。
private val mainViewModel: MainViewModel by inject()
Run Code Online (Sandbox Code Playgroud)
我发现此代码已包含在内,Android Studio 找不到它。
ActivityExt.kt:
inline fun <reified T : ViewModel> ComponentActivity.viewModel(
qualifier: Qualifier? = null,
noinline state: BundleDefinition? = null,
noinline owner: ViewModelOwnerDefinition = { from(this, this) },
noinline parameters: ParametersDefinition? …Run Code Online (Sandbox Code Playgroud) android ×10
android-architecture-components ×3
java ×3
kotlin ×3
android-architecture-lifecycle ×1
android-architecture-navigation ×1
boilerplate ×1
dagger ×1
dagger-hilt ×1
koin ×1
mvvm ×1