2012-04-05 3 views
6

Ho creato un test project che ha due diversi frammenti da mostrare nella stessa attività. Un frammento è per il paesaggio e l'altro per il ritratto.Diverso frammento non è stato caricato con orientamento modificato (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; 
    } 
} 

E ho due main.xml, uno in layout/e l'altro in layout-land /. Ogni main.xml punta al frammento corretto da utilizzare.

<!-- 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" /> 

Quando apro l'app sul paesaggio viene mostrato il LandscapeFragment, e quando ho aperto nel Ritratto viene mostrato il PortraitFragment. Fin qui tutto bene.

Ma se apro in orizzontale e ruoto il dispositivo in verticale, LandscapeFragment viene ricaricato e mostrato. Quale non è il comportamento previsto. Il PortraitFragment avrebbe dovuto essere caricato.

E la stessa cosa accade al contrario, se il dispositivo inizia con l'orientamento verticale e quindi lo ruoto in orizzontale: il PortraitFragment viene appena ricaricato, invece di caricare LandscapeFragment.

Cosa sto sbagliando?

risposta

2

Assicurarsi che non si dispone di: android:config="orientation" nel vostro manifest.xml

+0

No, la linea unica ho aggiunto al manifesto di default è 'android: screenOrientation = "sensore"' per attività – Luckcheese

+0

Cerchi di creare un punto di interruzione in onCreate() dell'attività per vedere se questo metodo viene chiamato quando ruoti il ​​dispositivo? –

+0

Sì. È chiamato. Ho aggiunto i messaggi di log su onCreate per la mia attività e per ciascun frammento. E quando ruoto il dispositivo, onCreate del frammento sbagliato viene chiamato dopo l'attività onCreate. – Luckcheese

1

Il problema è nelle vostre 2 layout, gli ID dei frammenti sono gli stessi. basta cambiare questi ID frammento, come:

fragmentportrait per il layout/main.xml

fragmentlanscape per il layout-terra/main.xml. (e cambiarne anche: Fragment frag = getSupportFragmentManager() findFragmentById (R.id.fragment);

frag.setRetainInstance (false); .)

+0

Ok, quel lavoratore. Ma non ho capito perché è necessario aggiungere diversi ID? Perché sul mio codice devo testare entrambi per impostare frag.setRetainInstance (false). Ma, ho anche realizzato un layout univoco con FrameLayout e aggiungendo i frammenti in base al codice dopo aver verificato l'orientamento corrente mediante getResource(). GetConfiguration(). Orientation! – Luckcheese