2012-04-05 6 views
6

Creé una prueba project que tiene dos fragmentos diferentes para mostrar en la misma actividad. Un fragmento es para el paisaje y el otro para el retrato.No se cargó un fragmento diferente al cambiar la orientación (android)

# My unique activity 
public class MainActivity extends FragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

# First Fragment 
public class LandscapeFragment extends Fragment { 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     TextView v = (TextView) inflater.inflate(R.layout.fragment, container, false); 
     v.setText("LANDSCAPE"); 
     return v; 
    } 
} 

# Other Fragment 
public class PortraitFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     TextView v = (TextView) inflater.inflate(R.layout.fragment, container, false); 
     v.setText("PORTRAIT"); 
     return v; 
    } 
} 

Y tengo dos main.xml, uno en layout/y otro en layout-land /. Cada main.xml apunta al Fragmento correcto que se utilizará.

<!-- layout-land/main.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment" 
    android:name="br.luckcheese.test.LandscapeFragment" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="5dp" /> 

<!-- layout/main.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragment" 
    android:name="br.luckcheese.test.PortraitFragment" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="5dp" /> 

<!-- layout/fragment.xml --> 
<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" /> 

Al abrir la aplicación en el paisaje se muestra la LandscapeFragment, y cuando abro en el retrato se muestra la PortraitFragment. Hasta aquí todo bien.

Pero si abro en horizontal y giro el dispositivo a vertical, entonces LandscapeFragment se vuelve a cargar y se muestra. Cuál no es el comportamiento predicho. PortraitFragment debería haberse cargado.

Y lo mismo ocurre al revés, si el dispositivo comienza en la orientación vertical y luego lo giro a horizontal: el VerticalFragmento simplemente se vuelve a cargar, en lugar de cargar LandscapeFragment.

¿Qué estoy haciendo mal?

Respuesta

2

Asegúrese de que usted no tiene: android:config="orientation" en su manifest.xml

+0

No, la línea única añadí al manifiesto por defecto es 'android: screenOrientation = "sensor"' para la actividad – Luckcheese

+0

¿Intenta hacer un punto de interrupción en onCreate() de su actividad para ver si se llama este método cuando gira el dispositivo? –

+0

Sí. Se llama. Agregué mensajes de registro en onCreate para mi actividad y para cada fragmento. Y cuando giro el dispositivo, se llama a onCreate del fragmento incorrecto después de la actividad enCreate. – Luckcheese

1

El problema está en sus diseños 2, los identificadores de fragmentos son los mismos. acaba de cambiar estos identificadores de fragmentos, como:

fragmentportrait para el diseño/main.xml

fragmentlanscape para la disposición de la tierra/main.xml. (Y cambiar también: frag Fragmento = getSupportFragmentManager() findFragmentById (R.id.fragment);

frag.setRetainInstance (falso); .)

+0

Ok, ese trabajador. Pero no entendí por qué es necesario agregar diferentes identificadores. Porque en mi código tengo que probar ambos para establecer frag.setRetainInstance (false). Pero también logro trabajar haciendo un diseño único con FrameLayout y agregando los fragmentos por código después de probar la orientación actual mediante la orientación getResource(). GetConfiguration(). – Luckcheese

Cuestiones relacionadas