如果单击了任何按钮,则阻止用户单击

时间:2019-03-07 13:20:57

标签: android button click

我的应用程序的每个活动都有很多按钮,单击一个按钮将导致打开新活动。我的问题是活动尚未显示,而用户再次单击相同的按钮或其他按钮时,将显示另一个活动。

如何防止这种情况?是否有任何快速干净的方法,例如在布局中设置选项?

3 个答案:

答案 0 :(得分:1)

您需要为此维护标志变量

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

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

     //Code To open second activity 
    }

    }

这将防止打开多个活动

答案 1 :(得分:1)

您可以使用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();

答复是否有帮助。

答案 2 :(得分:1)

在这里,我将尝试给出一个更通用,更可靠的解决方案。尽管Bhavik Parmar建议的答案非常接近,但使用的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扩展BaseActivity

public class HomeActivity extends BaseActivity {...}

现在您要做的就是在按钮的showLoading中调用此onClick()函数

showLoading();

您将获得干净的加载效果,并且将无法单击所有其他按钮。这种方法的另一个好处是,用户知道现在正在加载某些内容,因此他/她必须等待,单击任何位置现在都不会做很多事情。

现在您可能会问到何时关闭此加载,因此在BaseActivity的代码中您可以看到onResume()onStop()检查加载并根据android生命周期隐藏了它。这样就可以自动处理。尽管您可以根据自己的喜好更改实现。