如果单击了任何按钮,则阻止用户单击
Prevent user to click if any of the buttons was clicked
我的每个 activity 应用程序上都有很多按钮,单击一个按钮将打开新的 activity。我的问题是 activity 还没有出现,当用户再次点击同一个按钮或其他按钮时,将出现另一个 activity。
我该如何防止这种情况发生?有没有像在布局中设置选项这样快速干净的方法?
您需要为此维护标志变量例如
onClick(){
if(flag){
flag = false;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
flag = true;
}
},800);
//Code To open second activity
}
}
这将阻止打开多个活动
您可以为此使用 ProgressDialog
。这将改善您的 UI,也将解决您的问题。
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();
如果对你有帮助请回复
我会尽量在这里给出一个更通用和可靠的解决方案。尽管 Bhavik Parmar 建议的答案非常接近,但使用 ProgressDialog
,这已被弃用。您还可以使用这种方法在从您的服务器下载数据时显示加载,或者某些 API 被命中并且您正在等待它的响应。
首先,您必须创建一个 class,例如 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 {...}
现在您所要做的就是在按钮的 onClick()
中调用此 showLoading
函数
showLoading();
而且你会得到一个干净的加载效果,所有其他按钮将无法点击。这种方法的另一个好处是用户知道现在正在加载某些东西,he/she 必须等待,现在点击任何地方都不会做太多事情。
现在你可能会问这个加载什么时候关闭,所以在BaseActivity
的代码中可以看到onResume()
和onStop()
检查加载并根据android生命周期。所以这将自动处理。尽管您可以按照自己喜欢的方式更改实现。
我的每个 activity 应用程序上都有很多按钮,单击一个按钮将打开新的 activity。我的问题是 activity 还没有出现,当用户再次点击同一个按钮或其他按钮时,将出现另一个 activity。
我该如何防止这种情况发生?有没有像在布局中设置选项这样快速干净的方法?
您需要为此维护标志变量例如
onClick(){
if(flag){
flag = false;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
flag = true;
}
},800);
//Code To open second activity
}
}
这将阻止打开多个活动
您可以为此使用 ProgressDialog
。这将改善您的 UI,也将解决您的问题。
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();
如果对你有帮助请回复
我会尽量在这里给出一个更通用和可靠的解决方案。尽管 Bhavik Parmar 建议的答案非常接近,但使用 ProgressDialog
,这已被弃用。您还可以使用这种方法在从您的服务器下载数据时显示加载,或者某些 API 被命中并且您正在等待它的响应。
首先,您必须创建一个 class,例如 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 {...}
现在您所要做的就是在按钮的 onClick()
中调用此 showLoading
函数
showLoading();
而且你会得到一个干净的加载效果,所有其他按钮将无法点击。这种方法的另一个好处是用户知道现在正在加载某些东西,he/she 必须等待,现在点击任何地方都不会做太多事情。
现在你可能会问这个加载什么时候关闭,所以在BaseActivity
的代码中可以看到onResume()
和onStop()
检查加载并根据android生命周期。所以这将自动处理。尽管您可以按照自己喜欢的方式更改实现。