Android 禁用TabLayout中的选项卡

Android 禁用TabLayout中的选项卡,android,android-fragments,tabs,androiddesignsupport,android-tablayout,Android,Android Fragments,Tabs,Androiddesignsupport,Android Tablayout,我在我的应用程序中使用了最新设计支持库中的TabLayout。这些选项卡连接到一个viewpager,该viewpager加载每个选项卡的片段。我想禁用所有选项卡,直到viewpager为用户选择的选项卡加载片段。我无法禁用tablayout或使其不可单击。我使用了setEnabled(false)和setClickable(false),但它不起作用。我可以使用setVisiblity(View.GONE)使其不可见,但我希望选项卡始终可见 tabLayout = (TabLayout

我在我的应用程序中使用了最新设计支持库中的
TabLayout
。这些选项卡连接到一个viewpager,该viewpager加载每个选项卡的片段。我想禁用所有选项卡,直到viewpager为用户选择的选项卡加载片段。我无法禁用tablayout或使其不可单击。我使用了
setEnabled(false)
setClickable(false)
,但它不起作用。我可以使用
setVisiblity(View.GONE)
使其不可见,但我希望选项卡始终可见

    tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    tabLayout.setTabMode(TabLayout.MODE_FIXED);
    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.near_me_hover).setTag(1));
    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.all_hostels).setTag(2));
    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.top_five).setTag(3));
    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.advanced_search).setTag(4));
    tabLayout.setEnabled(false);
    tabLayout.setClickable(false);
XML

android.support.design.widget.TabLayout
android:id=“@+id/tabLayout” android:layout\u width=“match\u parent”
android:layout\u height=“0dp”
android:layout_weight=“0.15”
android:scrollbars=“horizontal”
android:splitMotionEvents=“false”>


tab click listener实现了3种方法,其中一种是onTabSelected(),使用布尔条件检查片段是否已初始化。然后,如果满足该条件,则允许事务发生。
如果要禁用TabLayout上的一个选项卡按钮,请在片段代码后初始化选项卡,然后尝试以下代码:

tabHost.getTabWidget().getChildTabViewAt(your_index).setEnabled(false);
另一个窍门:


您可以在tablayout上放置另一个空白透明视图,直到满足您的要求。当您需要启用/显示选项卡时,只需隐藏空白视图。

如果您想禁用选项卡,则只需要使用自定义视图

首先,创建自定义布局(例如textView)

v_tabview.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/tabItemView"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:gravity="center"
  android:maxLines="1"
  android:textColor="@drawable/selector_tab" />
最后,一个魔术!在该示例代码中,我禁用了所有选项卡。如果您需要禁用第二个和第三个选项卡,请在一个循环中选中“索引”,并在需要时禁用

 for (index in 0 until tabLayout.tabCount) {
   ((tabLayout.getTabAt(index)?.customView) as? TextView)?.let { textView ->
     textView.isEnabled = enable //boolean
     (textView.parent as View).enable(enable)
  }
}

您可以创建一个util函数,我在Kotlin中的乐趣:

fun-disableTabAt(tablayout:tablayout?,索引:Int){
(tablayout?.getChildAt(0)作为视图组)?.getChildAt(索引)?.isEnabled=false
}

当您想对视图执行某些操作时,可以调试或在父视图中单击以了解它是如何创建的。这样你可以做任何你想做的事。对于这种情况,您可以转到Tablayout类来理解。

要在位置启用特定选项卡,请执行以下操作:

LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0));     
tabStrip.getChildAt(position).setOnTouchListener((v,event)->false);
要在位置禁用选项卡

 tabStrip.getChildAt(position).setOnTouchListener((v,event)->true);
这里有两个帮助函数(kotlin),用于通过传递TabItem的名称来禁用和启用它

com.google.android.material:material:1.3.0-alpha02上测试

fun-disableTabItemAt(tabLayout:tabLayout?,tabText:String){
(tabLayout?.getChildAt(0)作为?视图组)?.childs?.iterator()?.forEach{
if((它作为TabLayout.TabView.tab?.text==tabText){
it.isEnabled=false
it.alpha=0.5f
}
}
}
有趣的启用TabItemat(tabLayout:tabLayout?、tabText:String){
(tabLayout?.getChildAt(0)作为?视图组)?.childs?.iterator()?.forEach{
if((它作为TabLayout.TabView.tab?.text==tabText){
it.isEnabled=真
it.alpha=1f
}
}
}
因此,如果您的选项卡名称是固定的,那么您可以这样做

disableTabItemAt(tabLayout,“Tab1”)
//以后启用它
enableTabItemAt(表布局,“表1”)

我发现最好的解决方案是创建
TabLayout
的子项,当使用
setEnabled(false)
时禁用触摸交互。 (注:以下为Kotlin)

class非接触式布局(context:context,attributeSet:attributeSet):TabLayout(context,attributeSet){
重写InterceptTouchEvent(事件:MotionEvent):布尔值{
回来!我被抓住了
}
}

通过这种方式,您还可以更改UI,将其设置为禁用,并避免依赖TableLayout的内部工作(可能会更改)正如其他一些答案所建议的那样。

tabhost与我使用过的tablayout不同吗?如果有任何问题,您可以尝试,然后让我知道我会检查它。我认为tabhost和设计支持库中的tablayout完全不同。所以我不能使用这种方法。让我再检查一遍。@war\u hero,如何防止tablayout将触控转发到viewpager?这是您禁用它的方式。val tabStrip=报告_tabs.getChildAt(0)作为(i in 0直到tabStrip.childCount){tabStrip.getChildAt(i).setOnTouchListener{v,event->true}的线性布局为什么?你能出示密码吗?你的要求是什么?我的意思是它只禁用触摸事件,用户仍然可以通过滚动查看页面。所以它不是完美的ANVER,如果用户寻呼机是可滚动的。你正在看错误的问题,检查这一个,你应该考虑降低不透明度标签的禁用,也因此它看起来不可能仍然可以选择;看见
 for (index in 0 until tabLayout.tabCount) {
   ((tabLayout.getTabAt(index)?.customView) as? TextView)?.let { textView ->
     textView.isEnabled = enable //boolean
     (textView.parent as View).enable(enable)
  }
}
LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0));     
tabStrip.getChildAt(position).setOnTouchListener((v,event)->false);
 tabStrip.getChildAt(position).setOnTouchListener((v,event)->true);