2011-09-07 23 views
5

He estado usando el paquete de compatibilidad de Android pero encontré el siguiente problema, parece que cada vez que creo un Fragmento como clase estática interna en mi aplicación y trato de iniciar esa actividad, muestra el siguiente errorPaquete de compatibilidad de Android Fragmento como clase estática interna

android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment org.wr.CreditCardHolderActivity.CreditCardHolderFragment: make sure class name exists, is public, and has an empty constructor that is public 

Y cuando separo el fragmento y la actividad todo funciona sin problemas, ¿alguien sabe por qué? y ¿cómo puedo solucionarlo?

Gracias!

+0

¿cómo se carga el fragmento en el contenedor? A través de diseño XML o en código? No he probado el primero, pero no he tenido problemas con las clases estáticas de fragmentos internos con este último. Por cierto, estoy usando v1 de la librería de compatibilidad. – PJL

+0

tengo un diseño con el fragmento que contiene obviamente la etiqueta junto con el nombre de la clase interna. – Necronet

+1

¿ha mirado el ejemplo de FragmentLayoutSupport en demostraciones de API? Hace referencia a una clase de fragmentos internos estáticos a través de: ** PJL

Respuesta

7

Si usted tiene un fragmento de clase interna como:

public class SomethingFragment extends Fragment {  
    public static final class TypeFragment extends BaseFragment 
    { 

    public static Fragment newInstance() 
    { 
     return new TypeFragment(); 
    } 

    private View mRootView; 
    private ListView mListView; 

    /** 
    * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, 
    *  android.view.ViewGroup, android.os.Bundle) 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     mRootView = inflater.inflate(R.layout.fragment_category_list, container, false); 
     mListView = (ListView) mRootView.findViewById(R.id.fragment_listview); 
     return mRootView; 
    } 
    } 
} 

Asegúrese de que su clasificación es pública cuando el FragmentActivity intenta reiniciar el fragmento que no la llama de la clase concreta que va a tramitar de la FragmentActivity abstracta, y si su clase interna Fragment es privada, Activity no hace referencia a onSaveState, onRestoreState, initialise, etc.

private a public ¡Solucionado para mí!

Actualización:

Tenga una mirada en https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/android/support/v4/app/Fragment.java

El método instantiate llama newInstance() al intentar restaurar la Fragment desde un estado guardado (en el que el fragmento fue completamente destruido).

El método newInstance requiere que la clase sea de acceso público, por lo que cuando se define como una clase interna, significa que tiene que ser public y static cuando corresponda.

Espero que esto aclare algunas preguntas futuras.

+1

Nunca es tarde para aceptar la respuesta, gracias, me olvidé de hacerlo ... – Necronet

+0

No entiendo: ¿por qué? es importante que los fragmentos sean públicos? ¿causará alguna excepción? si es así, ¿en qué casos? si la única clase que usa el fragmento es la actividad, ¿por qué no establecerlo como clase privada estática? si utilizo el fragmento solo para viewPager, ¿está bien establecerlo como privado? –

+1

@androiddeveloper Bueno, en realidad es el 'FragmentManager' que mantiene el ciclo de vida del' Fragmento', no la actividad. Necesitaría verificar el código fuente, pero todos los fragmentos son verificados para constructores públicos vacíos, ya que eso es lo que el administrador de fragmentos instanciará cuando necesite crear el fragmento, entonces, si sus fragmentos están en un alcance diferente al 'FragmentManager' esto por supuesto no es posible. (Supongo que llamaría a https://developer.android.com/reference/java/lang/Class.html#newInstance()) –

Cuestiones relacionadas