禁用TabLayout中的选项卡

时间:2015-10-09 04:05:43

标签: android android-fragments tabs androiddesignsupport android-tablayout

我在我的应用中使用了最新设计支持库中的TabLayout。选项卡附加到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
              机器人:ID = “@ + ID / tabLayout”               机器人:layout_width = “match_parent”
              机器人:layout_height = “0dp”
              机器人:layout_weight = “0.15”
              机器人:滚动条=“水平”
              android:splitMotionEvents =“false”>

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            switch (tab.getPosition()) {
                case 0:
                    viewPager.setCurrentItem(tab.getPosition());
                    tab.setIcon(R.drawable.near_me_hover);
                    break;
                case 1:
                    viewPager.setCurrentItem(tab.getPosition());
                    tab.setIcon(R.drawable.all_hostels_hover);
                    break;
                case 2:
                    viewPager.setCurrentItem(tab.getPosition());
                    tab.setIcon(R.drawable.top_five_hover);
                    break;
                case 3:
                    viewPager.setCurrentItem(tab.getPosition());
                    tab.setIcon(R.drawable.advanced_search_hover);
                    break;
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            switch (tab.getPosition()) {
                case 0:
                    tab.setIcon(R.drawable.near_me);
                    break;
                case 1:
                    tab.setIcon(R.drawable.all_hostels);
                    break;
                case 2:
                    tab.setIcon(R.drawable.top_five);
                    break;
                case 3:
                    tab.setIcon(R.drawable.advanced_search);

                    break;
            }

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
            tabLayout.getTabAt(position).select();
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

8 个答案:

答案 0 :(得分:3)

另一个技巧:

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

答案 1 :(得分:0)

选项卡单击侦听器实现了3种方法,其中一种是 onTabSelected()放置一个布尔条件来检查您的片段是否已初始化。然后,如果满足该条件,则允许进行交易。 还要在片段代码

之后初始化选项卡

答案 2 :(得分:0)

如果要禁用标签,只需使用customView

即可

首先,创建自定义布局(以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" />

创建选择器,用于更改状态启用/禁用(更改颜色)

selector_tab.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:color="#9e9e9e" android:state_enabled="false" /> //gray
  <item android:color="#64b246" android:state_enabled="true" /> //green
</selector>

然后给它充气,设置名称并添加到tabLayout

arrayStringNames.forEach { name ->
    val textView: TextView = inflater.inflate(R.layout.v_tabview, tabLayout, false) as TextView
    textView.text = name
    val tab = tabLayout.newTab()
    tab.customView = textView
    tabLayout.addTab(tab)
}

最后,一个魔术!在该示例代码中,我禁用了所有选项卡。如果您需要禁用第二个和第三个选项卡,请选中&#34; index&#34;在一个循环中,如果需要则禁用

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

答案 3 :(得分:0)

要在位置处启用特定标签:

LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0));     
tabStrip.getChildAt(position).setOnTouchListener((v,event)->false);

要禁用位置上的标签:

 tabStrip.getChildAt(position).setOnTouchListener((v,event)->true);

答案 4 :(得分:0)

这里有2个辅助函数(kotlin),可通过传递其名称来禁用和启用TabItem。

经过com.google.android.material:material:1.3.0-alpha02

的测试
fun disableTabItemAt(tabLayout: TabLayout?, tabText: String) {
    (tabLayout?.getChildAt(0) as? ViewGroup)?.children?.iterator()?.forEach {
            if((it as TabLayout.TabView).tab?.text == tabText) {
                it.isEnabled = false
                it.alpha = 0.5f
            }
    }
}

fun enableTabItemAt(tabLayout: TabLayout?, tabText: String) {
    (tabLayout?.getChildAt(0) as? ViewGroup)?.children?.iterator()?.forEach {
        if((it as TabLayout.TabView).tab?.text == tabText) {
            it.isEnabled = true
            it.alpha = 1f
        }
    }
}

因此,如果您的标签页名称是固定的,那么您可以这样做

disableTabItemAt(tabLayout, "Tab1")

// later enable it

enableTabItemAt(tabLayout, "Tab1")

答案 5 :(得分:0)

我发现最好的解决方案是创建TabLayout的子级,该子级在使用setEnabled(false)时禁用触摸交互。 (请注意,下面是科特林)

class NonTouchableTabLayout(context: Context,attributeSet: AttributeSet) : TabLayout(context, attributeSet) {

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        return !isEnabled
    }
}

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

答案 6 :(得分:-1)

您可以创建一个util函数,这在Kotlin中很有趣:

fun disalbeTabAt(tablayout: TabLayout?, index: Int) {
  (tablayout?.getChildAt(0) as? ViewGroup)?.getChildAt(0)?.isEnabled = false
}

当您想对视图执行某项操作时,可以调试或单击Parrent视图以了解它是如何创建的,通过这种方式,您可以执行所需的任何操作。对于这种情况,您可以转到Tablayout类进行了解。

答案 7 :(得分:-4)

如果您要在TabLayout上禁用一个标签按钮,请尝试以下代码:

tabHost.getTabWidget().getChildTabViewAt(your_index).setEnabled(false);