Android:一种管理代码中多个UI组件可见性的有组织方法

问题描述

我有一个活动MainActivity,例如,相对布局中的TextView tv1和ImageView iv1。通过布局MainViewModel的数据绑定,它们的可见性取决于基础tv1Visbility的LiveData iv1Visibilitylayout_main.xml

在用户交互时,根据viewModel内部的某些条件(例如STATE),UI组件的可见性会发生变化。

  • RUNNING状态具有tv1iv1可见
  • 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>

截屏:

screenshot

解决方法

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...