禁用TabLayout

我正在使用由devise库提供的新类:TabLayout。 我想在特定的情况下,我正在使用的不能改变标签了。

我设法禁用滑动其viewpager,但我不知道如何通过单击标签禁用页面的更改。

提前致谢。

Solutions Collecting From Web of "禁用TabLayout"

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

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

我发现了一个类似的答案,这个答案稍微简单一些,如果你想不必重写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); } 

如果你想重新启用选项卡,只需将子元素的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); } 

非常类似于pat8719的答案,但只是禁用选项卡足以阻止他们被选中。

 TabLayout tabLayout = (TabLayout) mParentView.findViewById(R.id.my_tabs); TabLayoutUtils.enableTabs( tabLayout, false ); 

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

一个很好的技巧,你可以使用:

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

 <FrameLayout android:clickable="true" android:layout_width="match_parent" android:layout_height="match_parent"/> 

这段代码将在您的视图之上创build空的/透明的视图。 android:clickable =“true”会拦截点击并阻止点击通过视图!

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

如果您使用Tab的自定义视图,则可以使用View#getParent()获取对Tab的视图的引用,如果您不想查看ViewGroups。

注意:使用自定义视图本身而不是父级可能无法工作,因为它可以有余量,允许用户单击空白区域并更改选项卡。

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

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

同样, 这只适用于使用自定义视图,否则getParent()调用将导致NullPointerException。