Implementazione di un TabListener che utilizza la libreria di supporto

Sto cercando di implementare la Navigazione con i Tab, ma voglio assicurarmi che le persone che dispongono di versioni precedenti di Android possono ancora utilizzare la mia applicazione.

L'app in mente ATM è abbastanza semplice, voglio solo essere in grado di capire come implementare il layout e poi aggiungerò i bit mancanti.

  • Come risolvere il problema con la limitazione del compilatore Dalvik sui methods 64K?
  • barra d'azione trasparente con AppCompat-v7 21
  • Uncaught ReferenceError: AFMA_getSdkConstants non è definito
  • Come eseguire la barra contestuale ActionMode overlay della barra degli strumenti appcompat-v7, ma non il cassetto di navigazione?
  • Patch Richiedi Android Volley
  • gestire automaticamente le risposte di http di gzip in Android
  • In each caso, ho un'attività di contenitore che estende l' attività di frammento (per garantire la compatibilità) e questa attività crea un TabView utilizzando un ActionBar (credo che il mio problema risiede qui). L'applicazione cercherà di creare tre tabs e aggiungerle all'ActionBar e voglio assicurarsi che l'utente possa scorrere avanti e indietro utilizzando la navigazione laterale.

    Ecco il TabListener che sto cercando di attuare:

    public static class TabListener<T extends Fragment> implements ActionBar.TabListener { private Fragment mFragment; private final Activity mActivity; private final String mTag; private final Class<T> mClass; public TabListener(Activity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } public void onTabSelected(Tab tab, FragmentTransaction ft) { if (mFragment == null) { mFragment = Fragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content, mFragment, mTag); } else { ft.attach(mFragment); } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { if (mFragment != null) { ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { } } 

    Ecco le mie importzioni, perché volevo assicurarmi di usare la libreria di supporto:

     import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.view.Menu; 

    Tuttavia, Eclipse mi sta dando problemi con i methods TabListener . Mi sta dicendo quanto segue: "Il tipo LayoutContainer.TabListener deve implementare il metodo astratto ereditato ActionBar.TabListener.onTabSelected (ActionBar.Tab, FragmentTransaction)"

    Quando seleziono Aggiungi methods non implementati Eclipse aggiunge essenzialmente i methods OnTabSelected OnTabReselected e OnTabUnselected , ma questa volta, passando la versione non di supporto del frammento ( android..app.Fragment ) come parametro.

    Qualche idea su come effettuare un'altra implementazione della navigazione laterale attraverso la libreria di supporto per garantire la compatibilità?

  • Generare Java da WSDL per l'utilizzo su Android con il client SOAP ksoap2-android?
  • Broadcastreceiver per rilevare la networking è collegata
  • Riavviare l'app ad una determinata attività?
  • Carica la foto utilizzando HttpPost MultiPartEntityBuilder
  • registrare la voce in una coda <byte > e inviarla al server
  • Come implementare una barra di progresso circolare di progettazione dei materiali in android
  • 5 Solutions collect form web for “Implementazione di un TabListener che utilizza la libreria di supporto”

     actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionBar.setDisplayShowHomeEnabled(false); actionBar.setDisplayShowTitleEnabled(false); tabA = actionBar.newTab().setText(""); tabB = actionBar.newTab().setText(""); Fragment fragmentA = new AFragmentTab(); Fragment fragmentB = new BFragmentTab(); tabA.setTabListener(new MyTabsListener(fragmentA)); tabB.setTabListener(new MyTabsListener(fragmentB)); actionBar.addTab(tabA); actionBar.addTab(tabB); 

    L'ascolto tabulatore è il seguente:

     protected class MyTabsListener implements ActionBar.TabListener{ private Fragment fragment; public MyTabsListener(Fragment fragment){ this.fragment = fragment; } public void onTabSelected(Tab tab, FragmentTransaction ft){ ft.add(R.id.layout2, fragment, null); } public void onTabReselected(Tab tab, FragmentTransaction ft) { } public void onTabUnselected(Tab tab, FragmentTransaction ft) { ft.remove(fragment); } } 

    e quindi fai una class per each scheda:

     public class BFragmentTab extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.login, container, false); } } 

    Ma tenga presente che la barra degli strumenti non è supportta per le versioni Android inferiori a 3.0. Se si desidera utilizzarlo in versioni precedenti, suggerisco di utilizzare la libreria actionBarSherlock.

    hmmm. mentre le opere di Malek non rispondono direttamente alla domanda ..

    Puoi semplicemente ignorare la transazione di frammento che ricevi nella callback e utilizzare il tuo:

     android.support.v4.app.FragmentTransaction fft = mActivity.getSupportFragmentManager().beginTransaction(); 

    Basta assicurarsi che la tua attività sia un FragmentActivity e sarai in grado di avviare una nuova transazione di frammento.

    Anche il metodo replace () nel frammento di transazione è molto più conveniente di aggiungere () e rimuovere ()

    La chiave è usare

     import android.support.v7.app.ActionBar; 

    … piuttosto che …

     import android.app.ActionBar; 

    Ciò evita la soluzione intelligente di Nelson Ramirez.

    Il seguente esempio completo, basato sulla documentazione ufficiale , è stato testato per funzionare da Android 3.0, API 11

     package com.example.myapp; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; import android.view.*; import android.widget.TextView; public class NavigationTabsBasicDemoActivity extends ActionBarActivity { static public class TabListener<T extends Fragment> implements ActionBar .TabListener { private Fragment mFragment; private final Activity mActivity; private final String mTag; private final Class<T> mClass; /** * Constructor used each time a new tab is created. * * @param activity The host Activity, used to instantiate the * fragment * @param tag The identifier tag for the fragment * @param pClass The fragment's Class, used to instantiate the * fragment * @see <a * href="http://developer.android.com/guide/topics/ui/actionbar * .html#Tabs"> * Developers Guide > Action Bar > Adding Navigation Tabs</a> */ public TabListener(Activity activity, String tag, Class<T> pClass) { mActivity = activity; mTag = tag; mClass = pClass; } @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { if (mFragment == null) { mFragment = Fragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content, mFragment, mTag); } else { // If it exists, attach it in order to show it ft.attach(mFragment); } } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { if (mFragment != null) { // Detach the fragment, because another one is about to be // attached. ft.detach(mFragment); } } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { // Do nothing. } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // No need for setContentView() to be used, Instead we use the root // android.R.id.content as the container for each fragment, // which is set in the TabListener ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionBar.setDisplayShowTitleEnabled(true); ActionBar.Tab tab = actionBar.newTab().setText("Artist").setTabListener( new TabListener<PlaceholderFragment>(this, "artist", PlaceholderFragment .class)); actionBar.addTab(tab); tab = actionBar.newTab().setText("Album").setTabListener( new TabListener<PlaceholderFragment>( this, "album", PlaceholderFragment.class)); actionBar.addTab(tab); } /** * In this example use one Fragment but display different data based on * which * tab is shown. In production you'd probably use a separate fragment. */ public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate( R.layout.fragment_navigation_tabs_basic_demo, container, false); TextView outputTextView = (TextView) rootView.findViewById( R.id.output_textView); outputTextView.setText("Hello " + getTag()); return rootView; } } } 

    Ho voluto implementare @ nelson-ramirez ma avevo un errore nell'accesso alla mActivity, quindi questa è una combinazione di queste due risposte e funziona per il mio progetto che utilizza una navigazione con il login con Facebook (che richiede la libreria di support.v4). le chiavi sono, creando un'attività privata privata che passate e assegnate all'avvio dell'ascoltatore e creando la propria transazione frammentazione, non usando quella dell'argomento. Inoltre, modificare l'attività principale a FragmentActivity, utilizzando la libreria v4, che consente l'accesso a getSupportFragmentManager ().

     public class MyTabListener implements ActionBar.TabListener{ private Fragment fragment; private FragmentActivity mActivity; public MyTabListener(Fragment fragment, FragmentActivity activity){ this.fragment = fragment; this.mActivity = activity; } @Override public void onTabSelected(ActionBar.Tab tab, android.app.FragmentTransaction ft) { android.support.v4.app.FragmentTransaction fft = mActivity.getSupportFragmentManager().beginTransaction(); fft.replace(R.id.fragment_container, fragment); fft.commit(); } @Override public void onTabUnselected(ActionBar.Tab tab, android.app.FragmentTransaction ft) { android.support.v4.app.FragmentTransaction fft = mActivity.getSupportFragmentManager().beginTransaction(); fft.remove(fragment); } @Override public void onTabReselected(ActionBar.Tab tab, android.app.FragmentTransaction ft) { } } 

    Qualche idea su come effettuare un'altra implementazione della navigazione laterale attraverso la libreria di supporto per garantire la compatibilità?

    Soluzione alternativa

    A partire dal 29 maggio 2015 è ansible utilizzare la Libreria di supporto per il design di Android . Esso include un layout di tabulazione e support dispositivi Android 2.1 o superiore.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.