8

To może być całkiem nowe pytanie, ale tak czy inaczej. Ponieważ Tabhost jest amortyzowany, próbowałem przejść do zakładek paska akcji, ale mam problemy z używaniem fragmentów. Czy mimo to istnieje możliwość korzystania z działań w zakładkach paska działań?Karty akcji paska bez użycia fragmentów?

Byłbym wdzięczny za każdą pomoc.

Dzięki.

+0

Naprawdę potrzebujesz użyć Fragmentów. Jakie są twoje problemy z wykorzystaniem Fragmentów? – nhaarman

+0

Jak już rozwinąłem moją Aplikację używającą Tabhost napotykam pewne problemy "konwertujące" moje karty do używania fragmentu. Moim głównym problemem między innymi :) jest to, że nie ma prostego przykładu, jak korzystać z rozwijanej listy i fragmentów. – Maddin

+1

Zadaj pytanie dotyczące ExpandableList i fragmentów ... Założę się, że dostaniesz jakąś pomoc. :) – Barak

Odpowiedz

3

Jeśli jesteś ustawiony na użyciu Inne nad Fragmenty można po prostu użyć zamiar rozpocząć swoją działalność od ActionBar.TabListener

startActivity(new Intent(thisActivity(), thatActivity.class)); 

Należy również sprawdzić ten komentarz na temat korzystania Fragments over Activities

+4

Rozpoczęcie działania przez naciśnięcie klawisza paska działań byłoby śmieszne, ponieważ spowodowałoby to pozbycie się samej karty i paska akcji, zastępując ją zawartością innej aktywności. – CommonsWare

+0

To są subklasy, pomysł nie jest wcale śmieszny. – slinden77

+0

Właściwie to jest dokładnie sposób, w jaki Google I/O 2014 został [zaimplementowany] (https: // github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/BaseActivity.java # L802). Po kliknięciu elementu w szufladzie nawigacji rozpoczyna się nowe działanie, co powoduje odtworzenie szuflady nawigacji. Klasa o nazwie "BaseActivity" służy do implementacji szuflady nawigacji dla wszystkich klas. – Benjamin

2

Czy mimo to istnieje możliwość korzystania z działań w zakładkach paska działań?

Na szczęście nie.

To nie znaczy, że musisz używać fragmentów. Twoja TabListener może zrobić, co chce, aby wpłynąć na zmianę w twoim interfejsie użytkownika. Rozwiązaniem o charakterze brutalnej siły byłoby ponowne wywołanie setContentView(), aby zrzucić wszystkie stare widżety i ustawić zupełnie nowy (prawdopodobnie inny) zestaw.

+0

Dzięki za odpowiedź. Wypróbowałem to za pomocą rozwiązania, które zaproponował MrEngineer, ale stało się tak, jak powiedziałeś. Oczywiście po prostu zmieniając widok, moje dwa okna są wyświetlane, ale nie ma już kontroli. Odgadnij, jak wyglądać i odczuwać teraz zamortyzowaną TabHost i będę musiał używać fragmentów. – Maddin

+0

ta odpowiedź jest błędna, ponieważ jest to naprawdę możliwe – slinden77

+0

Próbowałem tego rozwiązania i jest to możliwe, ale to na pewno hack. Pytanie brzmi, biorąc pod uwagę, że nie jest to optymalny sposób tworzenia tabview, jak bardzo wpływa to na wydajność mojej aplikacji? Chodzi mi o to, czy jest tak źle z rozwiązania, że ​​warto nauczyć się, jak poprawnie używać fragmentów i przepisywać je za pomocą ich aplikacji? – Kalaji

0

Możliwe jest użycie Activity z ActionBar. Uważaj jednak, że to nie jest zamierzone zachowanie, ale to nie znaczy, że nie działa idealnie.

import android.annotation.SuppressLint; 
import android.app.ActionBar; 
import android.app.ActionBar.Tab; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 

//@SuppressLint("NewApi") 
public class ActionBarActivity extends Activity { 

    private String TAG = getClass().getName(); 
    private Intent i = null; 
    private ActionBar actionBar; 
    private Tab one; 
    private Tab two; 
    private Tab three; 

    // create a tab listener that is called when the user changes tabs 
    ActionBar.TabListener tabListener = new ActionBar.TabListener() { 
     @Override 
     public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) { 
      if (tab.getTag().equals("one")){ 
       Log.d(TAG, "tab one selected"); 
       i = new Intent(getApplicationContext(), One.class); 
       determineRun(); 
      } 
      if (tab.getTag().equals("two")){ 
       Log.d(TAG, "tab two selected"); 
       i = new Intent(getApplicationContext(), Two.class); 
       determineRun(); 
      } 
      if (tab.getTag().equals("three")){ 
       Log.d(TAG, "tab three selected"); 
       i = new Intent(getApplicationContext(), Three.class); 
       determineRun(); 
      }   
     } 

     @Override 
     public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) { 
      // TODO Auto-generated method stub   
     } 

     @Override 
     public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) { 
      // TODO Auto-generated method stub  
     } 
    }; 

    // we only need to start the Activity if it's not actually already the current Activity! 
    void determineRun(){ 
     if (!TAG.equals(i.getComponent().getClassName())){ 
      startActivity(i); 
     } 
     return; 
    }//end method 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 

     actionBar = getActionBar(); 
     actionBar.setDisplayShowTitleEnabled(true); 
     actionBar.setSubtitle(getResources().getString("subtitle"));   
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
     one = actionBar.newTab(); 
     one.setText("Tab 1").setTag("one"); 
     two = actionBar.newTab(); 
     two.setText("Tab 2").setTag("two"); 
     three = actionBar.newTab(); 
     three.setText("Tab 3").setTag("three");     
     one.setTabListener(tabListener); 
     two.setTabListener(tabListener); 
     three.setTabListener(tabListener); 

     // You will have to set the selected Tab manually 
     // A good idea would be to create a subclass for each Tab based on this code 
     // Then, just create a new Activity which extends ActionBarActivity 
     actionBar.addTab(one, 0, false); 
     actionBar.addTab(two, 1, true); // selected Tab 
     actionBar.addTab(three, 2, false); 
    }//end method 

    @Override 
    public void onResume(){ 
     super.onResume(); 

     Log.d(TAG, "onResume()"); 
     Log.d(TAG, ""+i.getComponent().getClassName()); 
     // again, here you need to select the Tab manually 
     if (!TAG.equals(i.getComponent().getClassName())){ 
      actionBar.selectTab(two); // selected Tab 
     } 
    }//end method 

    @Override 
    public void onPause(){ 
     super.onPause(); 

     Log.d(TAG, "onPause()"); 
    }//end method 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 

     overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 
    }//end method  
}//end class 

Prawdopodobnie chcesz nadpisać animację w Activity więc zmiana zakładek jest seemless. Aby to zrobić, należy zmodyfikować metodę swoimi ActivityonCreate() która rozciąga ActionBarActivity

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    overridePendingTransition(0, 0); 
}//end method 
+0

Nie są to działania w kartach paska działań. Są to czynności * zapoczątkowane przez zakładki paska akcji *, które następnie przejmują ekran. Nie odnosi się to w ogóle do pytania PO. – CommonsWare

+0

ma ten sam efekt, nie miejmy dziury w jednym słowie – slinden77

0

jeśli moje rozumienie jest poprawne, którego chcesz użyć paska działań, aby zamienić aktywność zamiast fragmentu. w takim przypadku prosimy o dalsze czytanie.

z oficjalnego dokumentu, który można zobaczyć, funkcja paska akcji określa zestaw ui, pozycji. jeśli chcesz wdrożyć actionbar z działaniem, najważniejszą rzeczą do zrobienia jest 1. powiązanie twojej karty (pozycji) z twoją działalnością. 2. add tablistener oddzwanianie (instancję swoją nową działalność, stop bieżącej działalności) za każdym razem, zakładka to kliknąć

najlepszy projekt ma mieć tablistener realizowane lekcje indywidualne, tak, że każdy z Państwa działalności może wykorzystać tę klasę .

Powiązane problemy