2016-04-28 166 views
13

我正在使用自定义ProgressBar。现在,当一项任务正在进行时,我正在显示进度条,但用户仍然可以与视图和控件进行交互。 如何在整个视图中禁用用户交互,就像ProgressDialog所做的那样,当它可见时。如何在android中显示ProgressBar时禁用用户交互?

我是否需要在主视图顶部使用透明视图,并在该视图上显示进度条,并在任务完成后隐藏该视图。

或者只是得到我的父视图的id,并将其设置为禁用?但是,我无法调暗背景,就像view/Activity/Fragment上出现对话框时发生的情况一样。对?

我只想知道在进度条可见时不允许用户进行任何交互的方式。

谢谢

+0

可能的复制(HTTP://计算器。 com/questions/2819778/custom-drawable-for-progressbar-progressdialog) –

+2

@txteclipse我不想自定义进度条,我已经这样做了。 所以,我的问题是不重复的。 我只想禁用用户交互,而进度条是可见的,同样的方式,当ProgressDialog可见时,用户不能与其他UI控件交互而不关闭进度对话框。 现在我的问题是如何重复的问题。我的问题甚至与定制关系不大。 –

+0

如果你想要一个对话框的所有功能,你应该使用一个对话框。例如,模态不是微不足道的:接受的答案不会阻止键盘交互。链接问题中的第二个答案演示了如何在ProgressDialog中使用自定义ProgressBar资源。如果这不能满足您的需求,您可以使用ProgressBar使用[自定义布局](http://developer.android.com/guide/topics/ui/dialogs.html#CustomLayout)。 –

回答

38

你的问题:如何禁用用户交互,而进度采用的是Android可见?

要禁用,你只需要添加以下代码

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 

得到用户的互动活动,你只需要添加以下代码

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 

这里的用户交互是一个例子: 注:我只是给你一个例子▼如何禁用或保留用户交互

在xml.Something这样

<ProgressBar 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/progressBar" 
    android:visibility="gone"/> 

添加一个进度条,在MainActivity当按下按钮你显示进度和禁用用户交互。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mImageView = (ImageView) findViewById(R.id.imageView); 
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar); 
    mImageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mProgressBar.setVisibility(View.VISIBLE); 
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
     } 
    }); 
} 

当用户backPressed删除。如果您要添加的禁用功能,并灰色显示进度又保留用户interaction.Something这样

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    mProgressBar.setVisibility(View.GONE); 
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 
} 

,你需要添加你的xml布局文件是一个填充父项的线性布局。将其背景设置为#B0000000,并将其可见性设置为“已完成”。比编程式将其可见性设置为可见。

希望得到这个帮助!

-1

你可以像这样使用ProgressDialog;

ProgressDialog progressBar = new ProgressDialog(MainActivity.this); 
progressBar.setMessage("YourMessageHere"); 
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
progressBar.setCancelable(false); 
progressBar.show(); 
+0

我已经知道了。但我的问题只适用于ProgressBar。我不想使用ProgressDialog。我用我自己的动画使用自定义ProgressBar。 –

+2

ProgressDialog已弃用 – Raskayu

+0

@Raskayu,那是因为我在2016年4月28日发布了它,我不认为它已被弃用,然后 –

0

使用文档默认方法progressbar.setCancelable(假)

+0

但是它会对用户交互产生什么影响?当ProgressBar可见并且可取消设置为false时,我仍然可以触摸或键入EditText。 –

+0

,并从一个进度条开始有setCancelable(false)属性? –

+0

当您的任务运行可setenabled为您的父视图和任务完成setenabled设置为true后,你有选项 – R2R

0

只是设置:

在XML
android:clickable="true" 

<ProgressBar... 

只有这使得魔术!

1

我已通过向ProgressBar添加根布局来解决此问题。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:clickable="true" 
    android:gravity="center" 
    android:visibility="gone" 
    android:id="@+id/progress"> 
    <ProgressBar 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:indeterminate="true" 
     android:indeterminateTintMode="src_atop" 
     android:indeterminateTint="@color/primary"/> 
</LinearLayout> 

作出的根布局点击

android:clickable="true" 

注:在我的主要看法,我不得不RelativeLayout为根,并在最后一个位置上述代码添加了根布局内(最后儿童)。

希望这有助于!

0

用透明背景进行对话。 getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);的问题是,当应用程序将在后台进行并返回时,用户将能够与UI组件交互,进行更多的处理。因此,阻止用户界面做一个透明的对话框,如果你想设置时间隐藏/显示。在可运行线程中执行此操作。因此,该解决方案将是

public class TransparentDialogHelper { 

    private Dialog overlayDialog; 

    @Inject 
    public TransparentDialogHelper() { 

    } 

    public void showDialog(Context context) { 
     if (AcmaUtility.isContextFinishing(context)) { 
      return; 
     } 
     if (overlayDialog == null) { 
      overlayDialog = new Dialog(context, android.R.style.Theme_Panel); 
      overlayDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED); 
     } 
     overlayDialog.show(); 
    } 

    public void hideDialog() { 
     if (overlayDialog == null || AcmaUtility.isContextFinishing(overlayDialog.getContext())) { 
      return; 
     } 
     overlayDialog.cancel(); 
    } 
} 

-------- Timer 

Handler handler = new Handler(); 
handler.postDelayed(() -> { 
    view.hideProgress(); 
}, 2000); 
0

让你的父母布局相对布局&补充一点:

<RelativeLayout ... > 

    <other layout elements over which prog bar will appear> 

<RelativeLayout android:id="@+id/rl_progress_bar" 
       android:layout_width="match_parent" android:clickable="true" 
       android:layout_height="match_parent" > 
<ProgressBar android:id="@+id/pb" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:indeterminateOnly="true" 
      style="@android:style/Widget.DeviceDefault.ProgressBar" 
      android:theme="@style/AppTheme.MyProgressBar" 
    /> 
</RelativeLayout> 

如果你已经浮在你的用户界面的按钮,他们仍然抓住所有的焦点&保持点击时进度条是可见的。这种用途:(当你的PROG栏可见&重新启用它们时,你让你的前卫酒吧无形/消失)的[自定义绘制对象的进度/ ProgressDialog]

fb.setEnabled(false); 
相关问题