2012-03-06 11 views
8

Zajmuję się tworzeniem aplikacji, która używa nowego systemu Tabs (ActionBar.addTab()), będę miał 3 zakładki. Podczas ustalonego procesu chciałbym zablokować (wyłączyć) dwa z nich (nie usuwać, tylko nie akceptować kliknięć i nie zmieniać "selektora"Włącz/wyłącz Android ActionBar.Tab

Udało mi się nie zmienić treści (poprzez wdrożenie TabListener i nie zmieniając fragment, etc), ale zmiany selektora.

Czy mimo to tylko włączyć/wyłączyć zaczepy? nie trzeba wyjąć i włożyć ponownie?

góry dziękujemy! Br Danilo

Odpowiedz

2

Niestety, nie ma "włączania "lub" wyłącz "za pomocą zakładek na pasku akcji. Jak możesz zauważyć, możesz je usunąć i ponownie dodać - jest to najbliższy AFAIK.

+3

Tak, widzę! Dzięki. Mam menedżera, aby dodać dziwne zachowanie, dodając czek na TabListener, jeśli "mogę" zmienić karty, które zmienię, jeśli nie, ponownie wybieram ostatnią kartę = P – DaniloBertelli

+2

@DaniloBertelli Twoje obejście problemu nie jest proste. Aby zaktualizować wybraną kartę Wyświetl poprawnie "ponownie wybierz ostatnią kartę" będzie musiał być w kolejce w kolejności, którą można umieścić w poście na jednym z widoków. Jeśli naprawdę chcesz się dowiedzieć, dlaczego, to spójrz na ScrollingTabContainerView # TabClickListener.onClick - ponieważ twoja komenda tab.select będzie musiała być po wywołaniu [child.setSelected] (http://is.gd/OCa2tF) w tej metodzie. – Daniel

+0

@Daniel Nie ma wystarczającej liczby znaków w tym polu wejściowym, aby wyrazić moje podziękowania. Zasadniczo używam 'Handler' do różnych asynchronicznych zadań w moim' Activity', po prostu umieszczam 'setSelectedNavigationItem()' jako nowe '' Runnable'' z '' postAtFrontOfQueue() '' tam. Znakomity! – foxx1337

1

Mam dokładnie ten sam problem. W końcu udało się to rozwiązać. Jak już wspomniano, nie ma możliwości wyłączenia/włączenia karty. Jest tylko jedno wyjście - a to, aby wrócić do poprzedniej karty przy użyciu

getActionBar().setSelectedNavigationItem(tab); 

Należy jednak pamiętać, że powinno to NIE być wykonane od wewnątrz metody

onTabSelected(ActionBar.Tab tab,FragmentTransaction fragmentTransaction) 

, bo wtedy utknie w pętli rekurencyjnej. Tak więc w onTabSelected() - wyślij wiadomość do modułu obsługi aktywności, aby wykonać setSelectedNavigation().

Jednym z haczyków jest tutaj (będziesz wiedzieć, kiedy implementujesz): jaką wartość "tab" należy przekazać w ustawieniu selectSelectedNavigation. W tym celu musimy śledzić, czy jest to naciśnięty klawisz przełącznika tabulacji, czy zmuszony do przejścia do ostatniej zakładki za pomocą kodu.

W tym:

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

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

aw Handler,

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

Witam, dla mnie getActionBar(). SetSelectedNavigationItem (pozycja) nie działa. Co może być problem, próbuję ustawić położenie karty na niektórych warunkach. Czy ktoś może mi pomóc ... – user448250

0

I również w obliczu tej samej aplikacji problem.My zawiera trzy karty, a każda karta posiada przyciski, aby przenieść na kartę następnego i poprzedniego. Nie znajduję żadnej metody włączania lub wyłączania karty.

Użyłem klasy DataSetter do przechowywania poprzednio wybranej pozycji tabulacji i wartości boolowskiej w celu określenia wyboru tabulatora. Jeśli flaga logiczna ma wartość true, użytkownik nacisnął przycisk next/previous. W przeciwnym razie użytkownik próbuje wybrać kartę, naciskając tych, których nie akceptujemy.
Użyłem obsługi do wyboru tabulatora. Wewnątrz fragmentu, gdy użytkownik kliknie następny przycisk, rozgłaszam to żądanie. Żądanie rozgłoszeniowe ma wartość całkowitą, która jest pozycją następnej lub poprzedniej zakładki, którą chcemy ustawić. kodu wewnątrz fragmentu wynosi:

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

I stosuje CustomViewPager zamiast ViewPager zapobiec kartę przeciągnięcia. klasa CustomViewPager jest:

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

Wewnątrz onCreate metody główną działalność.java dodać te dwie linie:

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

Poniżej pozostały kod z 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); 
    }; 
    }; 
} 

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

Więcej można znaleźć na: http://suhas1989.wordpress.com/2014/10/13/enable-or-disable-actionbar-tab-in-android/

Powiązane problemy