如何解决Android:一种管理代码中多个UI组件可见性的有组织方法
我有一个活动MainActivity
,例如,相对布局中的TextView tv1
和ImageView iv1
。通过布局MainViewModel
的数据绑定,它们的可见性取决于基础tv1Visbility
的LiveData iv1Visibility
,layout_main.xml
。
在用户交互时,根据viewModel内部的某些条件(例如STATE
),UI组件的可见性会发生变化。
-
RUNNING
状态具有tv1
和iv1
可见 -
STOPPED
隐藏了iv1
。
目前,对于我添加到布局中的每个UI组件,我都必须在viewModel中创建另一个变量以使其具有可见性,将其数据绑定到xml中,然后将切换逻辑添加到每个切换方法中。
我最近了解到一种艰难的方法,即利用Android的内置体系结构组件,可以使用更简单的方法来完成操作(例如管理配置更改)。 类似地,是否有更好的方法可以完成上述操作?
例如具有适当Map<R.id.tv1,Map<STATE.RUNNING,LiveData<View.VISIBLE>>>
的{{1}}会更成熟还是仅仅是不必要的过度复杂化?
代码:
MainActivity.java
@BindingMethod
MainViewModel.java
package com.example.app1.android;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import com.example.app1.databinding.LayoutMainBinding;
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutMainBinding lay=LayoutMainBinding.inflate(getLayoutInflater());
setContentView(lay.getRoot());
lay.setViewModel(new ViewModelProvider(this).get(MainViewModel.class));
lay.setLifecycleOwner(this);
}
}
layout_main.xml
package com.example.app1.android;
import android.view.View;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
//import java.time.Duration;
public class MainViewModel extends ViewModel {
// private MutableLiveData<Duration> time;
private MutableLiveData<Integer> tv1Visibility,iv1Visibility;
private enum STATE {
STOPPED,RUNNING;
}
private STATE state;
// public final Map<Integer,Map<STATE,MutableLiveData<Integer>>> visibilityMap=Map.of();
// public LiveData<Duration> time;
private MutableLiveData<Integer> count;
public MainViewModel() {
// time = new MutableLiveData<>(Duration.ofSeconds(0));
state = STATE.STOPPED;
iv1Visibility = new MutableLiveData<>(View.GONE);
tv1Visibility = new MutableLiveData<>(View.VISIBLE);
count = new MutableLiveData<>(0);
}
public void tv1OnClick() {
switch (state) {
case STOPPED: {
state = STATE.RUNNING;
iv1Visibility.setValue(View.VISIBLE);
count.setValue(1);
}
break;
case RUNNING: {
int val = count.getValue() + 1;
count.postValue(val);
if (val % 10 == 0) {
state = STATE.STOPPED;
iv1Visibility.setValue(View.GONE);
count.postValue(0);
}
}
break;
}
// Log.d("sop","" + count.getValue());
}
public void iv1OnClick() {
switch (state) {
case RUNNING: {
count.postValue(0);
}
break;
case STOPPED: {
}
break;
}
}
// public LiveData<Duration> getTime() {
// return time;
// }
public LiveData<Integer> getTv1Visibility() {
return tv1Visibility;
}
public LiveData<Integer> getIv1Visibility() {
return iv1Visibility;
}
public LiveData<Integer> getCount() {
return count;
}
}
重置.xml(@ drawable / reset)(使用任何图标)
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="viewModel"
type="com.example.app1.android.MainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".android.MainActivity">
<RelativeLayout
android:id="@+id/layoutRealtive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:gravity="center"
android:textAlignment="center"
android:textSize="36sp"
android:textStyle="bold"
android:visibility="@{viewModel.tv1Visibility}"
android:text="@{String.valueOf(viewModel.count)}"
android:onClick="@{()->viewModel.tv1OnClick()}"
/>
<!-- app:setTimeToThis="@{viewModel.time}"-->
<!-- app:timeDisplayFormat0Day="@{@string/FORMAT_0_DAY_TIME}"-->
<!-- app:timeDisplayFormatNon0Day="@{@string/FORMAT_NON_0_DAY_TIME}"-->
<ImageView
android:id="@+id/iv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/tv1"
android:layout_alignBottom="@id/tv1"
android:layout_alignParentRight="true"
android:visibility="@{viewModel.iv1Visibility}"
android:onClick="@{()->viewModel.iv1OnClick()}"
android:src="@drawable/reset" />
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
截屏:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。