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は、上記と同じように変更されません。