2016-06-22 11 views
0

Ich habe jetzt 2 Fragment, ein Fragment Griff Portrait-Modus dann ein anderes Handle Landscape-Modus. Aber das Problem ist, dass wenn Sie von Hochformat zu Querformat dann zurück zu Hochformat drehen. Es wird nicht dasselbe angezeigt, das im ersten Porträtmodus angezeigt wird. Gibt es einen Code, der dieses Problem lösen kann?Wie wird die Orientierungsänderung mithilfe von Fragment behandelt?

Dieser Code ist im Inneren des Fragmentes Halter:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.frag_holder); 

    FragmentManager fm = getSupportFragmentManager(); 

    final Fragment fragment = Frag.newInstance(); //Portrait layout 
    final Fragment fragment2 = Frag2.newInstance(); //Landscape layout 

    int orientation = getResources().getConfiguration().orientation; //check whether is it portrait or landscape 


    if(orientation == Configuration.ORIENTATION_PORTRAIT){ 
     Fragment fragTAG = fm.findFragmentByTag(TAG_P); 
     if(fragTAG == null){ 
      Log.i("test","test"); 
       fm.beginTransaction() 
         .replace(R.id.fragPlaceHolder, fragment, TAG_P) 
         .commit(); //Portrait 
     } 
     else{ 
      fm.beginTransaction().replace(R.id.fragPlaceHolder,fragTAG).commit(); 
     } 

    } 
    if(orientation == Configuration.ORIENTATION_LANDSCAPE){ 
     Fragment fragTAG = fm.findFragmentByTag(TAG_L); 
     if(fragTAG == null){ 
       fm.beginTransaction() 
         .replace(R.id.fragPlaceHolder, fragment2, TAG_L) 
         .commit(); //Landscape 
     } 
     else{ 
      fm.beginTransaction().replace(R.id.fragPlaceHolder,fragTAG).commit(); 
     } 
    } 

} 

}

+0

Sie Ihre gespeicherten bearbeiten Erhalten Sie müssen den Code schreiben, das Problem verursacht zuerst. – jaibatrik

+0

Die einzige echte Lösung für Ihr Problem: Sie sollten nicht verschiedene Fragmente für unterschiedliche Orientierungen haben. So soll es auf Android nicht funktionieren. –

+0

@Xaver Kapeller dann gibt es andere Möglichkeiten, es zu tun, mit dem gleichen Ergebnis herauskommen. Ich möchte nur das gleiche auf beiden Bildern zeigen, auch wenn Sie drehen. –

Antwort

0

Entweder setRetainInstance(True); in den onCreate() Methods in beiden Fragmenten aufrufen können.

Oder

ein Headless-Fragment (ein Fragment ohne UI) auf Cache-Daten zu erstellen.

Eine dritte Option besteht darin, onSaveInstanceState(Bundle outState) zu verwenden, um Daten zwischenzuspeichern und die Daten erneut anzuzeigen, indem Bundle savedInstanceState in der onCreateView() - Methode verwendet wird.

+0

Ich habe versucht, die erste, aber wenn das Telefon zurück zum Hochformat Layout drehen. Es zerstört das erste Mal Porträt-Layout. Und was meinst du mit kopflos-Fragment? –

+0

Keiner der Ratschläge hier ist richtig. 'setRetainInstance()' dient nicht dazu, die Daten zu erhalten, sondern um die 'Fragment'-Instanz beizubehalten, wenn Sie dies tatsächlich tun müssen. Abgesehen davon wird das für den Op nicht funktionieren, da er für jede Orientierung ein anderes "Fragment" hat und vermutlich nur jeweils ein Fragment angehängt ist. Die 'Activity' kann keine Instanz des 'Fragments' behalten, das nicht angehängt ist.Ein 'Fragment' ohne UI besiegt den Zweck, ein' Fragment' zu haben, definitiv nicht. Und es wird natürlich nichts in dieser Situation reparieren. –

+0

Die einzige wirkliche Antwort ist Ihre dritte Option. Und wenn das richtig gemacht würde, würde das größtenteils automatisch passieren. Die einzige wirkliche Lösung besteht darin, nicht zwei verschiedene 'Fragmente' für unterschiedliche Orientierungen zu haben. Das verursacht die Probleme von Anfang an. –

-1

Wenn es eine Aktivitätsrotation gibt, wird die Aktivität geschlossen und erneut geöffnet, wobei onDestroy und onCreate aufgerufen werden. wenn Sie möchten, Daten speichern und in den anderen Dreh nachladen können Sie es mit onSaveInstanceState Methode tun:

protected void onSaveInstanceState(Bundle outState) 

zum Beispiel:

@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putString("name", "David"); 
    outState.putInt("age", 17); 
} 

und die Daten in dem onCreate

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    … 
    if(savedInstanceState != null) 
    { 
     savedInstanceState.getString("name"); 
     savedInstanceState.getInt("age"); 
    } 
} 
nachladen
3

Schritt 1: Add Config Änderungen in Ihrer Aktivität

<activity android:name=".ui.createtasks.CreateTaskActivity" 
     android:configChanges="orientation|screenSize|keyboardHidden" > </activity> 

Schritt 2: Ihren Text bearbeiten Werte In den onSaveInstanceState

@Override 
public void onSaveInstanceState(@NonNull Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putCharSequence(KEY_TITLE, et_text.getText().toString()); 
} 

Schritt 3: Textwerte durch onViewStateRestored

@Override 
public void onViewStateRestored(@Nullable Bundle savedInstanceState) { 
    super.onViewStateRestored(savedInstanceState); 

    String savedTitle = null; 
    if (savedInstanceState != null) { 
     savedTitle = savedInstanceState.getString(KEY_TITLE); 
     et_text.setText(savedTitle); 

    } 

} 
+0

Entschuldigung, es ist ein Manifest nicht Aktivität (Schritt 1: Add Config Änderungen in Ihrer Aktivität) Schritt 1: Add Config Änderungen in Ihrem Manifest – Sanaullah