禁用TabLayout

MHo*_*gge 46 android disabled-control android-tablayout

我正在使用设计库提供的新类:TabLayout.我想在特定的情况下,我正在使用的那个不能再改变标签了.

我设法禁用其viewpager上的滑动,但我无法弄清楚如何通过单击选项卡禁用页面更改.

提前致谢.

Mic*_*ele 98

我有同样的问题,我解决了它使用以下代码禁用选项卡上的触摸事件:

  LinearLayout tabStrip = ((LinearLayout)mTabLayout.getChildAt(0));
    for(int i = 0; i < tabStrip.getChildCount(); i++) {
        tabStrip.getChildAt(i).setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return true;
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

  • 这很有效,但安全吗?有没有可能失败的情况? (2认同)

pat*_*719 36

我发现了一个类似的答案,它更简单一点,如果你愿意,也可以让你在不必处理覆盖onTouch事件的情况下重新启用标签.

TabLayout tabLayout = (TabLayout)  mParentView.findViewById(R.id.my_tabs);

LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0));
tabStrip.setEnabled(false);
for(int i = 0; i < tabStrip.getChildCount(); i++) {
    tabStrip.getChildAt(i).setClickable(false);
}
Run Code Online (Sandbox Code Playgroud)

如果要重新启用选项卡,只需将子元素的tabStrip.setEnabled和setClickable设置为true即可

LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0));
tabStrip.setEnabled(true);
for(int i = 0; i < tabStrip.getChildCount(); i++) {
    tabStrip.getChildAt(i).setClickable(true);
}
Run Code Online (Sandbox Code Playgroud)

  • 有文本和指示符(文本下方的行)。该指示器仍然可以单击。 (2认同)

gra*_*tnz 19

与pat8719的答案非常相似,但只是禁用选项卡就足以阻止它们被选中.

TabLayout tabLayout = (TabLayout)  mParentView.findViewById(R.id.my_tabs);
TabLayoutUtils.enableTabs( tabLayout, false );
Run Code Online (Sandbox Code Playgroud)

TabLayoutUtils类

public class TabLayoutUtils {

    public static void enableTabs(TabLayout tabLayout, Boolean enable){
        ViewGroup viewGroup = getTabViewGroup(tabLayout);
        if (viewGroup != null)
            for (int childIndex = 0; childIndex < viewGroup.getChildCount(); childIndex++)
            {
                View tabView = viewGroup.getChildAt(childIndex);
                if ( tabView != null)
                    tabView.setEnabled(enable);
            }
    }

    public static View getTabView(TabLayout tabLayout, int position){
        View tabView = null;
        ViewGroup viewGroup = getTabViewGroup(tabLayout);
        if (viewGroup != null && viewGroup.getChildCount() > position)
            tabView = viewGroup.getChildAt(position);

        return tabView;
    }

    private static ViewGroup getTabViewGroup(TabLayout tabLayout){
        ViewGroup viewGroup = null;

        if (tabLayout != null && tabLayout.getChildCount() > 0 ) {
            View view = tabLayout.getChildAt(0);
            if (view != null && view instanceof ViewGroup)
                viewGroup = (ViewGroup) view;
        }
        return viewGroup;
    }

}
Run Code Online (Sandbox Code Playgroud)


Tob*_*iug 11

你可以使用的好方法:

创建一个框架布局,覆盖您要保护的视图,如下所示:

<FrameLayout
    android:clickable="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud)

此代码将在视图顶部创建并清空/透明视图.android:clickable ="true"将拦截点击并阻止点击进入视图!

这个hack可能会被优化,但它的几行代码可以同时保护多个视图!


Vla*_*she 7

对我来说,工作方法是这样的:

bool condition = ...
foreach (var view in _tabLayout.Touchables)
    view.Clickable = condition;
Run Code Online (Sandbox Code Playgroud)

这是100%安全的,因为API 1支持getTouchables()调用.无需手动遍历布局或其他内容.我认为它比接受的答案简单得多,但只有当所有标签都必须标记为不可点击时.

PS:示例是在C#上,因为我正在使用Xamarin,但将它转换回Java非常容易.请享用!=)

科特林的例子:

tabLayout.touchables.forEach { it.isClickable = false }
Run Code Online (Sandbox Code Playgroud)

Java示例:

for (View v: tabLayout.getTouchables())
    v.setClickable(false);
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,这对于禁用很有用,但无法重新启用。这是因为一旦将视图设置为不可点击,它将不再由getTouchables()返回。我以为您可以在第一个调用之类的东西之后存储视图,但是如果您希望更改层次结构,那将变得很危险。 (5认同)

Jac*_*how 5

如果您正在为选项卡使用自定义视图,并且您不想查看视图组,则可以使用 View#getParent() 来获取对选项卡视图的引用。

注意:使用自定义视图本身而不是父视图可能不起作用,因为它可以有边距,允许用户单击空白区域并仍然更改选项卡。

View tabView = (View) tab.getCustomView().getParent();

tabView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});

//or

tabView.setEnabled(false);
Run Code Online (Sandbox Code Playgroud)

OnTouchListener 方式和 setEnabled() 方式做不同的事情,但具有相同的效果。我更喜欢单线。

同样,这仅在您使用自定义视图时才有效,否则 getParent() 调用将导致 NullPointerException。