3

在我的main.xml布局中,我有一个<FrameLayout>元素是片段占位符

主.xml:

<FrameLayout
        android:id="@+id/fragment_placeholder"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>

我通过以下方式以编程方式将片段添加到上面<FrameLayout>

fragmentTransaction.add(R.id.fragment_placeholder, fragment, null);

然后我可以使用replace()更改为其他片段:

fragmentTransaction.replace(R.id.fragment_placeholder, otherFragment, null);

在我的项目的某个时刻,我需要获取当前显示的片段,并禁用视图上的所有内容。我首先通过以下方式成功获取当前显示片段:

Fragment currentFragment = fragmentManager.findFragmentById(R.id.fragment_placeholder); 

那么,如何禁用片段的视图?在视图上,可能有按钮,是否可以禁用整个视图?如果不可能,如何在视图上添加叠加层?

我试过了:

currentFragment.getView().setEnabled(false); 

但是,它不起作用,我仍然可以单击视图上的按钮。

4

2 回答 2

9

根据@Georgy 的评论,这里是禁用所有视图的触摸事件的答案副本(归功于@peceps)。


这是一个禁用某个视图组的所有子视图的函数:

 /**
   * Enables/Disables all child views in a view group.
   * 
   * @param viewGroup the view group
   * @param enabled <code>true</code> to enable, <code>false</code> to disable
   * the views.
   */
  public static void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) {
    int childCount = viewGroup.getChildCount();
    for (int i = 0; i < childCount; i++) {
      View view = viewGroup.getChildAt(i);
      view.setEnabled(enabled);
      if (view instanceof ViewGroup) {
        enableDisableViewGroup((ViewGroup) view, enabled);
      }
    }
  }

您可以在您的视图中调用此传递,Fragment由 检索Fragment.getView()。假设您的片段的视图是ViewGroup.

于 2012-11-01T13:26:40.067 回答
1

这是带有@Marcel 建议的Kotlin 实现。

fun ViewGroup.enableDisableViewGroup(enabled: Boolean, affectedViews: MutableList<View>) {
    for (i in 0 until childCount) {
        val view = getChildAt(i)
        if (view.isEnabled != enabled) {
            view.isEnabled = enabled
            affectedViews.add(view)
        }

        (view as? ViewGroup)?.enableDisableViewGroup(enabled, affectedViews)
    }
}

fun MutableList<View>.restoreStateAndClear(enabled: Boolean) {
    forEach { view -> view.isEnabled = enabled }
    clear()
}
于 2020-01-17T20:11:29.137 回答