8

Forse è una domanda abbastanza nuova, ma comunque. Dato che Tabhost è ammortizzato, ho provato a passare alle schede della barra delle azioni ma ho i miei problemi nell'utilizzo dei frammenti. C'è comunque la possibilità di utilizzare le attività all'interno delle schede della barra delle azioni?Tabelle della barra delle azioni senza utilizzare frammenti?

Apprezzerei qualsiasi aiuto.

Grazie.

+0

Hai davvero bisogno di usare Frammenti. Quali sono i tuoi problemi nell'usare Frammenti? – nhaarman

+0

Come ho già sviluppato la mia app utilizzando Tabhost, mi trovo ad affrontare alcuni problemi "convertendo" le mie schede in un frammento. Il mio problema principale, tra l'altro :) è fondamentalmente che non esiste un semplice esempio su come usare Elenco e frammenti espandibili. – Maddin

+1

Posta una domanda su ExpandableList e frammenti ... Scommetto che avresti qualche aiuto. :) – Barak

risposta

3

Se si sta insieme sull'utilizzo di attività nel corso Frammenti si potrebbe utilizzare l'intento di lanciare la vostra attività dal ActionBar.TabListener

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

Si dovrebbe anche controllare questo commento su utilizzando Fragments over Activities

+4

Avviare un'attività premendo una scheda della barra delle azioni sarebbe ridicolo, in quanto così facendo si eliminerebbe la scheda e la barra delle azioni stessa, sostituendola con il contenuto di un'altra attività. – CommonsWare

+0

Entrambe le sottoclassi sono arrivate, l'idea non è affatto ridicola. – slinden77

+0

In realtà questo è esattamente il modo in cui Google I/O 2014 è [implementato] (https: // github.com/google/iosched/blob/master/android/src/main/java/com/Google/campioni/apps/iosched/ui/BaseActivity.java # L802). Quando viene cliccato un elemento nel pannello di navigazione, viene avviata una nuova attività, ricrea il cassetto di navigazione. Una classe chiamata BaseActivity viene utilizzata per implementare il cassetto di navigazione per tutte le classi. – Benjamin

2

C'è comunque la possibilità di utilizzare le attività all'interno delle schede della barra delle azioni?

Fortunatamente, no.

Ciò non significa che devi usare i frammenti, però. Il tuo TabListener può fare tutto ciò che vuole influenzare la modifica nell'interfaccia utente. Una soluzione a forza bruta potrebbe chiamare di nuovo setContentView(), scaricare tutti i vecchi widget e disporre un set nuovissimo (presumibilmente diverso).

+0

Grazie per la risposta. Ho provato con la soluzione suggerita da MrEngineer ma è successo quello che hai detto. Ovviamente cambiando semplicemente la vista, vengono visualizzate le mie due finestre, ma il controllo non è più disponibile. Indovinate per aver fornito l'aspetto e l'aspetto del TabHost ora ammortizzato, dovrò usare i frammenti. – Maddin

+0

questa risposta è sbagliata, perché è davvero possibile – slinden77

+0

Ho provato questa soluzione ed è possibile ma è sicuramente un hack. La domanda è, dato che questo non è il modo ottimale per creare un tabview, quanto influisce negativamente sul rendimento della mia app? Voglio dire, è una soluzione così pessima che vale la pena imparare a usare correttamente i frammenti e riscrivere la mia app che li usa? – Kalaji

0

È possibile utilizzare uno Activity con ActionBar. Attenzione però non è un comportamento intenzionale, ma ciò non significa che non funzioni perfettamente.

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 

probabilmente si desidera ignorare l'animazione nel vostro Activity modo che il cambiamento delle schede è ampiamente positivo. Per fare ciò, modificare il metodo della vostra ActivityonCreate() che si estende ActionBarActivity

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

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

Queste non sono attività nelle schede della barra delle azioni. Queste sono attività * avviate dalle schede della barra delle azioni * che poi occupano lo schermo. Questo non riguarda affatto la domanda dell'OP. – CommonsWare

+0

ha lo stesso effetto, non facciamo pignoli su una parola – slinden77

0

se la mia comprensione è corretta, si desidera utilizzare barra delle azioni per scambiare l'attività, invece di frammento. in questo caso, continua a leggere.

dal documento ufficiale che è possibile vedere, la funzione barra delle azioni definisce un insieme di ui, posizione. se si desidera implementare la barra delle azioni con attività, la cosa più importante da fare è 1. associare la scheda (posizione) alla propria attività. 2. aggiungi il callback tablistener (crea la tua nuova attività, interrompi l'attività corrente) ogni volta che fai clic sulla scheda

il miglior design è che il tablistener abbia implementato una classe separata, in modo che ciascuna delle tue attività possa usare questa classe .

Problemi correlati