2015-07-29 4 views
38

Я использую новый класс, предоставляемый библиотекой дизайна: TabLayout. И я хочу, чтобы в некоторых случаях тот, который я использую, больше не может изменять вкладку.Disable TabLayout

Мне удалось отключить прокрутку на своем viewpager, но я не могу понять, как отключить изменение страницы, нажав на вкладки.

Спасибо заранее.

+1

Как вы отключили салфетки? – Analizer

+1

Вам нужно отключить салфетки на своем ViewPager. Я отправляю вас на этот пост: http://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still-be-able-to-s – MHogge

+0

@Shargotth Как вы отключили салфетки ?? – KJEjava48

ответ

77

У меня была такая же проблема, и я решил его отключить сенсорную событие на закладках с помощью следующего кода:

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

.. И это сработало. – Wizard

+0

Работает и для меня. Благодаря! –

+0

работает для меня. Потрясающие! – mmw5610

33

Я нашел подобный ответ, который является немного более простым, а также позволяет повторно включить позже, если вы хотите, чтобы не иметь дело с переопределением события 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 для дочерних элементов истинного

LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0)); 
tabStrip.setEnabled(true); 
for(int i = 0; i < tabStrip.getChildCount(); i++) { 
    tabStrip.getChildAt(i).setClickable(true); 
} 
12

Очень похожи на ответ по 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; 
    } 

} 
5

Хороший трюк вы можете использовать:

создать макет рамки, которые охватывают вид (ы) вы хотите защитить от щелчка, как следующее:

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

Этот код создаст и пуст/прозрачный вид сверху вашего вида. Андроид: clickable = "true" перехватит клик и не позволит клику перейти через представление!

Этот хак, вероятно, может быть оптимизирован, но его несколько строк кода для защиты нескольких видов одновременно!

+1

Это может быть «взломать», но IMO это гораздо лучший подход, чем другие ответы, опираясь на специфику внутренней реализации TabLayout. Мне нужно было создать надпись «intro» поверх всего приложения и отключить все под ней, пока она работает, поэтому это простая, но эффективная магическая пуля. –

+0

hacky, но намного лучше для экономии кода – Sheychan

+0

Это гений, поскольку все ответы на код мне не удалось. – Elisa

3

Если вы используете пользовательское представление для вкладки, вы можете использовать View # getParent(), чтобы получить ссылку на представление вкладки, если вы не хотите просматривать 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.

1

Для меня рабочий подход заключается в следующем:

bool condition = ... 
foreach (var view in _tabLayout.Touchables) 
    view.Clickable = condition; 

Это 100% безопасно, так как getTouchables() вызов поддерживается начиная с API 1. Нет необходимости вручную траверс макет или что-то.Я считаю, что это намного проще, чем принятый ответ, но только тогда, когда все вкладки должны быть отмечены не кликабельными.

P.S .: пример на C#, поскольку я работаю с Xamarin, но довольно легко перевести его обратно на Java. Наслаждайтесь! =)

+0

Это то, что я сделал. Я также понизил альфу на представлении, чтобы иметь визуальный индикатор состояния отключенной/включенной вкладки. – natronite