Android:addContentView()を使用して、使いやすいユニバーサルローディングをカプセル化し、ページボタンの繰り返しクリックを防ぎます

O.まえがき

アプリケーション開発では、ネットワークへのアクセスは時間のかかる操作であるため、ページがデータをロードまたは送信するときに、通常、ページにロードロード図を表示し、ユーザーにしばらく待つように促します。ロードグラフを実装する方法はたくさんあります。たとえば、一部の更新フレームワークには、ユーザーがプルダウンして更新するときにグラフをロードする方法や、ダイアログを使用してロードポップアップをカスタマイズする方法があります。表示する必要がある場合は、showDialogを閉じることができます。非表示にする必要があります。

ただし、実際の使用では、更新フレームワークに付属するドロップダウンロードはデータ送信時に使用できないことが多く、カスタムダイアログでは使用中のフォームリークを例外とする場合があります。この記事では上記とは異なる方法を紹介します。実装メソッドの読み込み方法:ActivityのaddContentView()メソッドを使用すると、一般的な読み込みがActivityの基本クラスにカプセル化されます。サブクラスを直接使用して最適化すると、ページボタンが繰り返しクリックされるのを防ぐことができます。

1.アクティビティの基本クラスに一般的な負荷をカプセル化します

Androidプロジェクトには通常、アクティビティ基本クラスBaseActivityがあり、BaseActivityに次のコードを直接追加します。

    /**
     * mliuxb:通用的Loading加载图
     * 使用方法:在需要显示Loading的地方调用showCenterLoading(),在需要隐藏loading的地方调用hideCenterLoading()即可
     * 若需修改Loading底部的文字提示则调用重载方法showCenterLoading(String text)
     * 注意:以下三个方法在本类中没有调用,而是在子类中调用,所以不影响本基类的任何逻辑
     */
    private LinearLayout llLoading;
    private TextView tvLoading;

    /**
     * 显示Loading
     */
    public void showCenterLoading() {
        showCenterLoading("数据加载中...");
    }

    /**
     * 显示Loading
     */
    public void showCenterLoading(String text) {
        addLoadingView();
        if (llLoading != null && tvLoading != null) {
            tvLoading.setText(text);
            llLoading.setVisibility(View.VISIBLE);
        }
    }

    /**
     * 隐藏Loading
     */
    public void hideCenterLoading() {
        if (llLoading != null) {
            llLoading.setVisibility(View.GONE);
        }
    }

    /**
     * 添加Loading布局
     */
    private void addLoadingView() {
        if (llLoading == null || tvLoading == null) {
            final View loadingView = View.inflate(this, R.layout.layout_global_center_loading, null);
            final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
            params.gravity = Gravity.CENTER;
            addContentView(loadingView, params);//核心方法
            llLoading = findViewById(R.id.ll_global_center_loading);
            tvLoading = findViewById(R.id.tv_global_center_loading);
        }
    }

レイアウトファイルlayout_global_center_loadingは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/ll_global_center_loading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:background="@drawable/shape_global_center_loading_bg"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="20dp"
    android:visibility="gone">

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminateDrawable="@drawable/anim_global_rotate_loading" />

    <TextView
        android:id="@+id/tv_global_center_loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:textColor="@android:color/black"
        android:textSize="14sp"
        tools:text="数据加载中..." />
</LinearLayout>

レイアウトファイルのshape_global_center_loading_bgは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">

    <!--颜色-->
    <solid android:color="#CCCCCCCC"/>

    <!--给矩形加圆角-->
    <corners android:radius="10dp"/>

    <!--边框-->
    <!--<stroke android:width="5dp" android:color="@color/blue_base"/>-->

</shape>

レイアウトファイルのanim_global_rotate_loadingは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<rotate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/icon_global_center_loading"
    android:fromDegrees="0"
    android:toDegrees="1800">

</rotate>

上記は、Activityの基本クラスに一般的な読み込みをカプセル化し、コメントで説明されているようにサブクラスで呼び出し、読み込みを表示する必要がある場合はshowCenterLoading()を呼び出し、読み込みを非表示にする必要がある場合はhideCenterLoading()を呼び出します。

2つのメソッドはどこでも使用でき、カスタムダイアログでフォームがリークするリスクを回避します。通常、showCenterLoading()メソッドはネットワークアクセス要求が送信される前に呼び出され、hideCenterLoading()は応答が受信された後に呼び出されます。

2.読み込みを最適化して、ページボタンが繰り返しクリックされないようにします

アプリケーションの実際の使用プロセスでは、ネットワークがスタックしたり、機能に時間がかかりすぎたりするため、ユーザーは必然的に急いで繰り返し操作を実行します。データが送信された場合(つまり、データベースがデータを書き込んでいる場合) 、複数の送信が発生する可能性があります。データベースがデータを複数回書き込む可能性があり、データがダーティになります。このとき、サーバーが検証を行う必要があります。もちろん、フロントエンドに第一線の防御を追加する必要もあります。

フロントエンドがサーバーと対話しているとき、この時点でロードロード図が表示されます。この期間は、ユーザーによる繰り返しの操作を避けるための時間であるため、ロード図をフルスクリーンに変更し、ルートレイアウトをに設定します。 android:clickable = "true"現時点では、最下層の通常のページのレイアウトがカバーされており、クリックやその他の操作に応答できないため、ユーザーによる繰り返しのクリックが回避されます。

BaseActivity基本クラスのコードを次のように変更します。

    /**
	 * mliuxb更新:通用的Loading加载图
	 * 使用方法:在需要显示Loading的地方调用showCenterLoading(),在需要隐藏loading的地方调用hideCenterLoading()即可
	 * 若需修改Loading底部的文字提示则调用重载方法showCenterLoading(String text)
	 * 注意:以下三个方法在本类中没有调用,而是在子类中调用,所以不影响本类的任何逻辑
	 */
	private FrameLayout flLoading;
	private TextView tvLoading;

	/**
	 * 显示Loading
	 */
	public void showCenterLoading() {
		showCenterLoading("数据加载中...");
	}

	/**
	 * 显示Loading
	 */
	public void showCenterLoading(String text) {
		addLoadingView();
		if (flLoading != null && tvLoading != null) {
			tvLoading.setText(text);
			flLoading.setVisibility(View.VISIBLE);
		}
	}

	/**
	 * 隐藏Loading
	 */
	public void hideCenterLoading() {
		if (flLoading != null) {
			flLoading.setVisibility(View.GONE);
		}
	}

	/**
	 * 添加Loading布局
	 */
	private void addLoadingView() {
		if (flLoading == null || tvLoading == null) {
			final View loadingView = View.inflate(this, R.layout.layout_global_center_loading, null);
			final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
			params.gravity = Gravity.CENTER;
			addContentView(loadingView, params);//核心方法
			flLoading = findViewById(R.id.fl_global_center_loading);
			tvLoading = findViewById(R.id.tv_global_center_loading);
		}
	}

主な理由は、レイアウトパラメータがFrameLayout.LayoutParams.WRAP_CONTENTからFrameLayout.LayoutParams.MATCH_PARENTに変更され、ロードレイアウトがフルスクリーンになるようにするためです。

対応するレイアウトファイルlayout_global_center_loadingは、次のように変更されます。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fl_global_center_loading"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:clickable="true"
    android:focusable="true"
    android:visibility="gone">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/shape_global_center_loading_bg"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="20dp">

        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:indeterminateDrawable="@drawable/anim_global_rotate_loading" />

        <TextView
            android:id="@+id/tv_global_center_loading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textColor="@android:color/black"
            android:textSize="14sp"
            tools:text="数据加载中..." />
    </LinearLayout>
</FrameLayout>

上記のように、最初にFrameLayoutネストのレイヤーを追加し、ルートレイアウトFrameLayout match_parentを作成して、元の読み込みサイズが変更されないようにします。次に、ルートレイアウトandroid:clickable = "true"を設定すると、基になるレイアウトがカバーされ、応答できなくなります。クリックなど。

その中で、shape_global_center_loading_bgとanim_global_rotate_loadingは、上記と同じように変更されません。

 

 

おすすめ

転載: blog.csdn.net/beita08/article/details/115028939