【问题标题】:how to disable of select some tab when using TabLayout ?使用 TabLayout 时如何禁用选择某些选项卡?
【发布时间】:2018-02-11 01:17:13
【问题描述】:

我使用控件android.support.design.widget.TabLayout

我有 4 个标签 - 在每个标签上我显示一些 ViewPager - (使用片段显示不同的 viewPager)

我想禁用所有选项卡,直到用户添加第一个选项卡上存在的一些数据。

我找不到任何禁用选项卡的方法。

代码:

 <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?android:attr/detailsElementBackground"
        android:clickable="true"
        app:tabGravity="center"
        app:tabMode="scrollable"
        app:tabTextAppearance="@style/MineCustomTabText" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.AppBarLayout>


 ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());


    adapter.addFragment(new Fragment1(), "Fragment1");
    adapter.addFragment(new Fragment2(), "Fragment2");
    adapter.addFragment(new Fragment3(), "Fragment3");
    adapter.addFragment(new Fragment4(), "Fragment4");

// 需要禁用 Fragment2 & Fragment3 & Fragment4 直到用户添加一些存在于 Fragment1 上的字符串

【问题讨论】:

  • 同样的问题。@Yanshof,如果你已经得到解决方案,请告诉我

标签: android android-fragments


【解决方案1】:

试试这个:

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

参考:Disable TabLayout

【讨论】:

    【解决方案2】:

    如果您想为您的 TabLayout 处理 onTabSelected,您可以执行此操作并检查是否允许它们显示该片段。

    tab_layout.addOnTabSelectedListener( new TabLayout.OnTabSelectedListener() {
                override onTabReselected( TabLayout.Tab tab ) {}
                override onTabUnselected( TabLayout.Tab tab ) {}
                override onTabSelected( TabLayout.Tab tab ) {
                    if( ... is not disabled )
                    pager.currentItem = tab.position
                }
    
            })
    

    【讨论】:

      【解决方案3】:

      如果你想禁用标签,你只需要使用自定义视图

      首先,创建您的自定义布局

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

      最后,一个魔术!在该示例代码中,我禁用了所有选项卡。如果您需要禁用第二个和第三个选项卡,请在循环中检查“索引”并根据需要禁用

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

      【讨论】:

        【解决方案4】:

        这是我的解决方案。我用的是Kotlin语言,Java也一样

        private fun disableTab(tabLayout: TabLayout, index: Int) {
            (tabLayout.getChildAt(0) as ViewGroup).getChildAt(index).isEnabled = false
        }
        

        它对我有用!

        【讨论】:

          【解决方案5】:

          ViewPager2 + tabLayout

          TabLayoutMediator(Tabs,ViewPager) { tab,  pos->
             tab.view.isEnabled = false
          }.attach()
          

          【讨论】:

            【解决方案6】:

            听起来您想要做的是禁用切换选项卡以开始的功能,然后在输入一些数据后重新启用它。 这很容易,您只需要做两件事:

            一旦你实现了上述两个,你可以在你的 onCreate 方法中禁用切换选项卡,比如

            tabs.isEnabled = false
            viewpager.setSwipePagingEnabled(false)
            

            一旦用户在第一个选项卡上输入了数据,您就可以再次启用它

            tabs.setEnabled(true)
            viewpager.setSwipePagingEnabled(true)
            

            【讨论】:

              猜你喜欢
              • 2012-08-28
              • 2015-08-28
              • 2015-05-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-02-25
              相关资源
              最近更新 更多