2012-03-06 18 views
8

Sto sviluppando un'applicazione che utilizza il nuovo sistema Tabs (ActionBar.addTab()), avrò 3 schede. Durante un determinato processo vorrei bloccare (disabilitare) due di essi (non rimuovere, solo non accettare clic e non modificare il 'selettore'.Abilita/disabilita Android ActionBar.Tab

Sono stato in grado di non modificare il contenuto (implementando il TabListener e non cambiare il frammento, ecc) ma i cambiamenti di selezione.

c'è comunque da solo abilitare/disabilitare le schede?, senza dover rimuovere e aggiungere di nuovo?

Grazie in anticipo! BR, Danilo

risposta

2

Spiacente, non c'è "Abilita "o" disabilita "con le schede nella barra delle azioni. Come si nota, è possibile rimuovere e riaggiungerli: è il più vicino possibile ottenere AFAIK.

+3

Sì, capisco! Grazie. Ho il manager di aggiungere un comportamento bizzarro aggiungendo un controllo su TabListener, se "posso" modificare le schede che cambio, altrimenti selezionerò nuovamente l'ultima scheda = P – DaniloBertelli

+2

@DaniloBertelli La tua soluzione non è così semplice. Per aggiornare la scheda selezionata Visualizza correttamente la tua "riselezione della scheda più recente" dovrà essere in una Runnable in coda tramite un post su una delle viste. Se vuoi veramente sapere perché, guarda in ScrollingTabContainerView # TabClickListener.onClick - poiché la chiamata a tab.select dovrà essere successiva alla chiamata a [child.setSelected] (http://is.gd/OCa2tF) in quel metodo. – Daniel

+0

@Daniel non ci sono abbastanza caratteri in questa casella di input per esprimere i miei ringraziamenti. Fondamentalmente sto già usando un 'Handler' per vari compiti asincroni nel mio' Activity', ho semplicemente messo 'setSelectedNavigationItem()' come un nuovo '' Runnable'' con '' postAtFrontOfQueue() '' lì. Brillante! – foxx1337

1

Ho avuto esattamente lo stesso problema. Finalmente è stato in grado di risolverlo. Come già detto, non c'è modo di disabilitare/abilitare una scheda. C'è solo una via d'uscita - ed è quello di tornare alla scheda precedente utilizzando

getActionBar().setSelectedNavigationItem(tab); 

Nota tuttavia, che questo dovrebbe NON essere fatto all'interno del metodo di

onTabSelected(ActionBar.Tab tab,FragmentTransaction fragmentTransaction) 

, perché allora rimane bloccato nel ciclo ricorsivo. Quindi all'interno di onTabSelected() - invia un messaggio al gestore di attività per eseguire setSelectedNavigation().

Uno scatto qui è (lo saprete quando implementate): quale valore "tab" per passare in setSelectedNavigation. Per questo, dobbiamo tenere traccia del fatto che si tratti di un interruttore a schede premuto dall'utente o di un passaggio forzato all'ultima scheda tramite il codice.

Per questo:

public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 

    if (forcedTabSwitch) 
     forcedTabSwitch = false; 
    else 
     mTabToBeSwitchedTo = tab.getPosition(); 
} 

e nel Handler,

switch (msg.what) { 
      case SWITCH_TO_TAB : 
       forcedTabSwitch = true; 
          break; 
} 
+0

Ciao, per me getActionBar(). SetSelectedNavigationItem (posizione) non funziona. Che cosa potrebbe essere un problema, sto cercando di impostare la posizione della scheda in alcune condizioni. Qualcuno può aiutarmi .. – user448250

0

Ho anche affrontato stessa applicazione problem.My ha tre schede e ogni scheda ha per spostare sulla scheda successiva e precedente. Non trovo alcun metodo per abilitare o disabilitare tab.

Ho utilizzato classe DataSer per mantenere la posizione della scheda e il valore booleano precedentemente selezionati per determinare la selezione della scheda. Se il flag booleano è true, l'utente ha premuto il pulsante next/previous. In caso contrario, l'utente sta tentando di selezionare la scheda premendo che non è consentita.
Ho utilizzato il gestore per la selezione della scheda. Dentro il frammento quando l'utente fa clic sul pulsante successivo Trasmetto quella richiesta. La richiesta di trasmissione ha un parametro intero che è la posizione della scheda successiva o precedente che vogliamo impostare. codice all'interno frammento è:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
    { 
     View rootView = inflater.inflate(R.layout.first_tab_fragment, container, false); 
     next = (Button)rootView.findViewById(R.id.nextbutton); 
     next.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Intent intent = new Intent("TAB_CLICKED"); 
      Bundle bundle = new Bundle(); 
      bundle.putInt(MainActivity.POSITION,1); 
      intent.putExtras(bundle); 
      getActivity().sendBroadcast(intent); 
     } 
    }); 
    return rootView; 
    } 

ho usato CustomViewPager invece di ViewPager per evitare scheda strisciata. classe CustomViewPager è:

  public class CustomViewPager extends ViewPager {    

      private boolean enabled;    
      public CustomViewPager(Context context) { 
       super(context); 
      } 

      public CustomViewPager(Context context, AttributeSet attrs) { 
       super(context, attrs); 
      } 

      @Override 
      public boolean onTouchEvent(MotionEvent event) { 
       // TODO Auto-generated method stub 
       if (this.enabled) { 
        return super.onTouchEvent(event); 
       } 

       return false; 
      } 

      @Override 
      public boolean onInterceptTouchEvent(MotionEvent event) { 
       // TODO Auto-generated method stub 
       if (this.enabled) { 
         return super.onInterceptTouchEvent(event); 
        } 

        return false; 
      } 

      public void setPagingEnabled(boolean enabled) { 
       this.enabled = enabled; 
      }    
     } 

All'interno metodo OnCreate di MainActivity.java aggiungere questo due linee: codice

 viewPager = (CustomViewPager) findViewById(R.id.pager); 
    viewPager.setPagingEnabled(false); 

Di seguito è restanti da MainActivity.java:

@Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 

    Log.d("MainActivity","onTabSelected"); 
    if(setter.getFlag() == true) 
    { 
     viewPager.setCurrentItem(setter.getposition()); 
    }   
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
    Log.d("MainActivity","onTabUnselected");  
    //handler.sendEmptyMessage(0); 
    Message message = new Message(); 
    message.arg1 = setter.getposition(); 
    handler.sendMessage(message);  
} 

Handler handler = new Handler() 
{ 
    public void handleMessage(android.os.Message msg) 
    { 
     int arg1 = msg.arg1;    
     Log.d("arg1",arg1+""); 
     //viewPager.setCurrentItem(arg1); 
     mActionBar.setSelectedNavigationItem(arg1); 
     Log.d("handler","Inside handler"); 
    } 
}; 

BroadcastReceiver receiver = new BroadcastReceiver(){ 

    public void onReceive(Context context, android.content.Intent intent) { 

     String action = intent.getAction(); 
     Bundle bundle = intent.getExtras(); 
     int position = bundle.getInt(MainActivity.POSITION); 
     Log.d("Action",action); 
     Log.d("position",position+""); 
     setter.setposition(position); 
     setter.setflag(true); 
     Message message = new Message(); 
     message.arg1 = position; 
     handler.sendMessage(message); 
    }; 
    }; 
} 

Infine DataSetter.java:

public class DataSetter 
    { 
     int position; 
     boolean flag; 
     void setposition(int value) 
     { 
      position = value; 
     } 
     void setflag(boolean value) 
     { 
      flag = value; 
     } 
     int getposition() 
     { 
      return position; 
     } 
     boolean getFlag() 
     { 
      return flag; 
     } 
    } 

Più potete trovare su: http://suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/

Problemi correlati