如何在Android中看到ProgressBar时禁用用户交互?

时间:2016-04-28 14:50:38

标签: android user-interface progress-bar

我正在使用自定义ProgressBar。现在,当一项任务正在进行时,我正在显示进度条,但用户仍然可以与视图和控件进行交互。 如何在ProgressDialog可见的情况下禁用整个视图上的用户交互。

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

或者只是获取我的parentView的ID并将其设置为禁用?但后来我无法调暗背景,就像在视图/活动/片段上出现对话框时所发生的那样。对?

我只是想知道在进度条可见时禁止用户进行任何交互的方法。

由于

7 个答案:

答案 0 :(得分:95)

  

您的问题:如何在Android中看到ProgressBar时禁用用户交互?

要禁用用户互动,您只需添加以下代码

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

要获得用户互动,您只需添加以下代码

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

以下是一个例子:   注意:我只给您一个示例,说明如何禁用或保留用户互动

在你的xml中添加一个进度条。像这样

<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);
        }
    });
}

当用户反击时,您再次删除进度条,保留用户交互。这样的事情

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

如果要添加禁用和灰显显示的功能,则需要在xml布局文件中添加填充父级的线性布局。将其背景设置为#B0000000,将其visibilty设置为GONE。然后以编程方式将其visibility设置为VISIBLE

希望这有帮助!

答案 1 :(得分:7)

我已通过向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为根,并在最后一个位置(最后一个孩子)的根布局中添加了上述代码。

希望这会有所帮助!!

答案 2 :(得分:5)

刚设置:

PHP Parse error:  syntax error, unexpected '4' (T_LNUMBER), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$'
你的xml中的

android:clickable="true" 

只有这才能制造魔力!

答案 3 :(得分:2)

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

答案 4 :(得分:1)

制作透明背景的对话框。 getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);的问题在于,当应用程序进入后台并返回时,用户将能够与UI组件进行交互,需要更多处理。因此,阻止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);

答案 5 :(得分:1)

将您的父级布局设为相对布局&amp;加上这个:

    <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>

如果你的用户界面中有浮动按钮,他们仍然可以抓住所有焦点。进度条可见时保持可点击状态。用于此用途:(当你的编程栏可见时,当你使你的编程栏看不见/消失时重新启用它们)

fb.setEnabled(false);

答案 6 :(得分:0)

accepted Answer上扩展(双关语意味):

使用kotlin时,可以使用扩展功能。这样,您就可以快速美观地阻止和取消阻止UI。

fun AppCompatActivity.blockInput() {
    window.setFlags(
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
}

fun AppCompatActivity.unblockInput() {
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
}

fun AppCompatActivity.blockInputForTask(task: () -> Unit) {
    blockInput()
    task.invoke()
    unblockInput()
}

您可以在活动中使用阻止和取消阻止功能。另外,您可以添加更多功能,例如显示Toast或其他内容。

在自定义视图或任何其他视图中使用它时,只需将上下文转换为活动并使用功能即可。

在不同范围内需要使用blockInputForTask包围简单的线性任务以及blockInputunblockInput时。

您可以像这样使用blockInputForTask

blockInputForTask { 
    // Your lines of code
    // Can be multiple lines
}