Я использовал элемент управления 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

5
Yanshof 2 Сен 2017 в 03:05

5 ответов

Лучший ответ

Если вы хотите обработать onTabSelected для вашего TabLayout, вы можете сделать это и проверить, разрешено ли показывать этот фрагмент.

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
            }

        })
1
Advice-Dog 2 Сен 2017 в 00:27

Если вы хотите отключить вкладку, вам просто нужно использовать customView

Прежде всего, создайте свой собственный макет

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)
  }
}
1
gbixahue 27 Апр 2018 в 07:44

Есть мое решение. Я использую язык Kotlin, Java - то же самое

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

Это сработало для меня!

1
Mạnh Hoàng Huynh 14 Сен 2018 в 04:04

ViewPager2 + tabLayout

TabLayoutMediator(Tabs,ViewPager) { tab,  pos->
   tab.view.isEnabled = false
}.attach()
0
HUAN XIE 7 Май 2020 в 19:43

Попробуй это:

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

Ссылка: Отключить TabLayout

2
Pang 2 Сен 2017 в 03:22