2015-07-29 19 views
38

Sto utilizzando la nuova classe fornita dalla libreria di progettazione: TabLayout. E voglio in casi specifici che quello che sto usando non può più cambiare scheda.Disabilita TabLayout

Sono in grado di disabilitare lo scorrimento sul suo viewpager ma non riesco a capire come disabilitare la modifica della pagina facendo clic sulle schede.

Grazie in anticipo.

+1

Come hai disabilitato lo scorrimento? – Analizer

+1

È necessario disabilitare lo scorrimento sul suo ViewPager. Vi mando a questo post: http://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still-be-able-to-s – MHogge

+0

@Shargotth Come hai disabilitato lo scorrimento ?? – KJEjava48

risposta

77

Ho avuto lo stesso problema e ho risolto disattivando tocco evento su schede con il seguente codice:

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

.. E ha funzionato. – Wizard

+0

Funziona anche per me. Grazie! –

+0

funziona per me. Eccezionale! – mmw5610

33

ho trovato una risposta simile che è un po 'più semplice e consente inoltre di riattivare il schede in seguito, se lo si desidera, senza dover affrontare l'override dell'evento 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); 
} 

E se si desidera riattivare le schede appena impostati tabStrip.setEnabled e setClickable per gli elementi figlio su true

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

Molto simile alla risposta da pat8719 ma solo disabilitando le schede è sufficiente per impedire che vengano selezionati.

TabLayout tabLayout = (TabLayout) mParentView.findViewById(R.id.my_tabs); 
TabLayoutUtils.enableTabs(tabLayout, false); 

TabLayoutUtils classe

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

Un buon trucco è possibile utilizzare:

creare un layout di cornice che coprono la vista (s) che si desidera proteggere da un clic come il seguente:

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

Questo codice creerà e visualizzerà vuoto/trasparente nella parte superiore della vista. L'androide: clickable = "true" intercetterà il clic e impedirà il click di passare attraverso la vista!

Questo hack può probabilmente essere ottimizzato ma le sue poche righe di codice per proteggere più viste contemporaneamente!

+1

Questo potrebbe essere un "hack", ma IMO è un approccio molto migliore rispetto alle altre risposte, basandosi sulle specifiche dell'implementazione interna di TabLayout. Avevo bisogno di creare una sovrapposizione di "intro" sull'intera app e di disabilitare tutto sotto di essa mentre è in esecuzione, quindi questa è una bacchetta magica semplice ma efficace. –

+0

hacky ma molto meglio per il salvataggio del codice – Sheychan

+0

Questo è geniale in quanto tutte le risposte al codice non sono riuscite per me. – Elisa

3

Se si utilizza una vista personalizzata per la scheda, è possibile utilizzare Visualizza # getParent() per ottenere un riferimento alla visualizzazione della scheda se non si desidera esaminare i ViewGroup.

Nota: l'utilizzo della vista personalizzata stessa anziché del genitore potrebbe non funzionare perché può avere margine, consentendo all'utente di fare clic nello spazio vuoto e modificare la scheda.

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

Il modo OnTouchListener e il modo setEnabled() fare cose diverse, ma hanno lo stesso effetto. Preferisco l'one-liner.

Anche in questo caso, funziona solo se si utilizza una vista personalizzata, altrimenti la chiamata getParent() causerà una NullPointerException.

1

Per me il metodo di lavoro è questo:

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

Questo è sicuro al 100%, come getTouchables() chiamata è supportata dal API 1. Non c'è bisogno di manualmente layout di traslazione o qualcosa del genere.Lo considero molto più semplice di quello della risposta accettata, ma solo quando tutte le schede devono essere contrassegnate come non selezionabili.

P.S .: l'esempio è su C#, poiché sto lavorando con Xamarin, ma è abbastanza facile da tradurre in Java. Godere! =)

+0

Questo è quello che ho fatto. Ho anche abbassato l'alfa sulla vista per avere un indicatore visivo dello stato disabilitato/abilitato della scheda. – natronite