Combinando fragmentos y una barra de acción en el nivel de Android <13. ¿Existe una forma factible?

StackOverflow https://stackoverflow.com/questions/9342777

Pregunta

Me gustaría escribir mi proyecto en la versión de Android más baja posible para mis REQS, que es 11.

Pero necesito fragmento. Attac y Actionbars.

Dado que el nivel 11 no incluye fragmento. Attach I importo el paquete de soporte para V4.

Pero ahora el problema es que el tablero para ActionTab no usa el fragmento V4 sino el fragmento de nivel 11. El casting no funcionará.

¿Realmente necesito cambiar al nivel 13 o hay una solución factible para implementar todo esto en el nivel 11?

Aquí está el código:

import android.app.ActionBar;
import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.Fragment;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;

import android.os.Bundle;
import android.support.v4.app.Fragment;

public class TestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    }

    public static class TabListener<T extends android.support.v4.app.Fragment> /* to make sure it take the Fragment from the support package! */
    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 clz
     *            The fragment's Class, used to instantiate the fragment
     */
    public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    /* The following are each of the ActionBar.TabListener callbacks */

    public void onTabSelected(Tab tab,
        android.support.v4.app.FragmentTransaction ft) {
        // Check if the fragment is already initialized
        if (mFragment == null) {
        // If not, instantiate and add it to the activity
        mFragment = Fragment.instantiate(mActivity, mClass.getName());
        ft.add(android.R.id.content, mFragment, mTag);
        } else {
        // If it exists, simply attach it in order to show it
        ft.attach(mFragment);
        }
    }

    /* these are NOT the implementation of the TabListener above, since the use the
     * 
     * the  FragmentTransactionof the support package and not of level 11
     * 
     */

    public void onTabUnselected(Tab tab,
        android.support.v4.app.FragmentTransaction ft) {
        if (mFragment != null) {
        // Detach the fragment, because another one is being attached
        ft.detach(mFragment);
        }
    }

    public void onTabReselected(Tab tab,
        android.support.v4.app.FragmentTransaction ft) {
        // User selected the already selected tab. Usually do nothing.
    }

    /* these are added since they belong to the above definition of TabListener 
     * 
     * unfortunately the use the FragmentTransaction of level 11, not the one of the support package!
     * 
     */
    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {

    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {

    }

    }
}
¿Fue útil?

Solución

No estoy seguro de si todavía necesita esto, pero usamos ActionBarSherlock y parece que también podría ayudarlo:

http://actionbarSherlock.com/

Otros consejos

Estoy usando ActionBarCompat y Fragments en API Ver 8.0, la única diferencia con su código es que estoy usando ft.replace en lugar de ft.add y un viewpager en el XML para mostrar los fragmentos, se ejecuta bien hasta ahora ...

import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.Tab;

public final 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 clz  The fragment's Class, used to instantiate the fragment
      */
    public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    /* The following are each of the ActionBar.TabListener callbacks */

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // Check if the fragment is already initialized
        if (mFragment == null) {
            // If not, instantiate and add it to the activity
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            ft.replace(R.id.pager, mFragment, mTag);
        } else {
            // If it exists, simply attach it in order to show it
            ft.replace(R.id.pager, mFragment, mTag);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            // Detach the fragment, because another one is being attached
            ft.remove(mFragment);
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // User selected the already selected tab. Usually do nothing.
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top