Я постараюсь дать более общее и надежное решение здесь. Хотя ответ, предложенный Бхавиком Пармаром, довольно близок, он использует ProgressDialog
, что уже устарело. Вы также можете использовать этот подход, чтобы показать загрузку, когда данные загружаются с вашего сервера или какой-то API-интерфейс срабатывает, и вы ожидаете его ответа.
Во-первых, вам нужно будет создать класс, например BaseActivity
, который расширяет AppCompatActivity
, а второй макет для ProgressBar
.
Ниже приведен макет
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent_black_10"
android:id="@+id/relative_layout_progress_bar"
android:visibility="gone"
android:clickable="true"
android:focusable="true"
android:elevation="8dp">
<android.support.v4.widget.ContentLoadingProgressBar
android:id="@+id/loadingProgressBar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerInParent="true"
android:layout_centerVertical="true"
android:indeterminateTint="@color/colorPrimary"
android:progressBackgroundTint="@color/colorPrimary"
android:visibility="visible" />
</RelativeLayout>
Теперь в BaseActivity вам нужно добавить код ниже
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
public class BaseActivity extends AppCompatActivity {
private View progressBarView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (progressBarView == null) {
ViewGroup parent = (ViewGroup) findViewById(android.R.id.content).getRootView();
progressBarView = getLayoutInflater().inflate(R.layout.layout_progress_bar, null);
parent.addView(progressBarView);
}
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onStop() {
if(isLoading()) {
hideLoading();
}
super.onStop();
}
@Override
protected void onResume() {
if(isLoading()) {
hideLoading();
}
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
public void showLoading() {
if(this.isFinishing()) {
return;
}
if (progressBarView != null) {
progressBarView.bringToFront();
progressBarView.setVisibility(View.VISIBLE);
}
}
public void hideLoading() {
if(!this.isFinishing()) {
if(progressBarView != null) {
progressBarView.setVisibility(View.GONE);
}
}
}
public boolean isLoading() {
return (progressBarView != null && progressBarView.getVisibility() == View.VISIBLE);
}
}
Теперь везде, где вам нужно реализовать эту функцию, расширьте эту BaseActivity
, например, если она вам нужна в HomeActivity
, тогда сделайте HomeActivity
extension BaseActivity
.
public class HomeActivity extends BaseActivity {...}
Теперь все, что вам нужно сделать, это вызвать эту функцию showLoading
в вашей onClick()
кнопки
showLoading();
И вы получите чистый эффект загрузки, и все остальные кнопки не смогут быть нажаты. Другим преимуществом этого подхода является то, что пользователь узнает, что что-то загружается сейчас, и ему / ей приходится ждать, и щелчок в любом месте ничего не изменит прямо сейчас.
Теперь вы можете спросить, когда эта загрузка будет закрыта, поэтому в коде BaseActivity
вы можете видеть, что onResume()
и onStop()
проверяют загрузку и скрывают ее в соответствии с жизненным циклом Android. Так что это будет обработано автоматически. Хотя вы можете изменить реализацию так, как вам нравится.