Запретить пользователю нажимать, если была нажата какая-либо из кнопок - PullRequest
0 голосов
/ 07 марта 2019

У меня много кнопок на каждом действии моего приложения, нажатие на кнопку приведет к открытию нового действия.Моя проблема заключается в том, что пока активность еще не обнаружена, и пользователь снова нажимает на ту же кнопку или другую кнопку, будет отображаться другая активность.

Как мне предотвратить это?Есть ли какой-нибудь быстрый и чистый способ настройки параметров в макете?

Ответы [ 3 ]

1 голос
/ 07 марта 2019

Вы можете использовать ProgressDialog для этого.Это улучшит ваш пользовательский интерфейс и также решит вашу проблему.

progress = new ProgressDialog(context, R.style.ThemeOverlay_AppCompat_Dialog_Alert);
    progress.setMessage("Loading ...Please Wait! ");
    progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progress.setIndeterminate(true);
    progress.setCancelable(false);

Когда вы хотите показать диалог прогресса, вы можете назвать его следующим образом:

progress.show();

А когда вы не хотитечтобы отобразить его, вы можете просто удалить его, вызвав cancel метод, подобный этому

progress.cancel();

Ответьте, если вам это поможет.

1 голос
/ 07 марта 2019

Я постараюсь дать более общее и надежное решение здесь. Хотя ответ, предложенный Бхавиком Пармаром, довольно близок, он использует 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. Так что это будет обработано автоматически. Хотя вы можете изменить реализацию так, как вам нравится.

1 голос
/ 07 марта 2019

Для этого вам нужно сохранить флаговую переменную. Например,

 onClick(){
    if(flag){
      flag = false;

  new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                 flag = true;
            }
        },800);

     //Code To open second activity 
    }

    }

Это предотвратит открытие нескольких действий

...