【问题标题】:Disabling all touches when loading indicator is shown显示加载指示器时禁用所有触摸
【发布时间】:2014-07-02 21:35:07
【问题描述】:

我有一个简单的主布局,然后我添加了一个片段布局,该布局仅显示在该主布局之上加载的指示器。问题是我仍然可以按下加载指示器后面的按钮。

反正有没有禁用触摸,所以它不会传递到后面?我不想一一禁用主屏幕上的每个按钮。

【问题讨论】:

  • 当任何自定义弹出窗口处于活动状态时,我总是手动将按钮设置为 isClickable(false)。但我很想知道是否有更清洁的解决方案。
  • 您可能需要在指示器处于活动状态时禁用底层布局:stackoverflow.com/questions/12300796/…
  • 我相信我已经尝试过了,但没有成功。
  • 您是否考虑过使用ProgressDialog 代替?这应该会阻止后面的活动。
  • 我检查了,但似乎超出了我的需要。

标签: android


【解决方案1】:

您可以在包含 ProgressBar 的布局中将“clickable”属性设置为“true”:

<FrameLayout 
    android:id="@+id/progressBarContainer"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:clickable="true" >

    <ProgressBar
        android:id="@+id/progressBar" 
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_gravity="center" />

</FrameLayout>

然后,当 ProgressBar 可见时,它的容器(尽管它是不可见的,但它会填满整个屏幕)将拦截任何点击事件,这样它们就不会在 ProgressBar 显示时落入底层布局。

要使用此功能,请在您想要显示 ProgressBar 时执行此操作:

findViewById(R.id.progressBarContainer).setVisibility(View.VISIBLE);

然后在你完成后执行此操作:

findViewById(R.id.progressBarContainer).setVisibility(View.INVISIBLE);

例如,如果您在 AsyncTask 中使用它,则可以在 onPreExecute() 中使其可见,然后在 onPostExecute() 中使其不可见。

【讨论】:

  • 很高兴我能帮上忙。这也是我现在正在使用的。
【解决方案2】:

当你想阻止用户触摸时返回true。在您的 Activity 中覆盖此方法。

@Override
public boolean onTouchEvent( MotionEvent event ) {
    return true;
}

【讨论】:

  • 听起来比手动禁用 10 多个按钮更好的解决方案 :)
  • 设置 clickable="true" 的另一种方法对我来说更简洁,因为现在任何使用此片段的活动都将禁用背景视图。
猜你喜欢
  • 2012-01-08
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
相关资源
最近更新 更多