Frage

Hallo, ich arbeite mit einem View -Pager und Fragmenten. Ich möchte die Orientierungsänderungen überschreiben, damit die OnCreateView -Methode nicht jedes Mal ausgeführt wird, wenn sich die Orientierung ändert. Dies liegt daran, dass für meine App, dass sich die Orientierung langsam ändert, viel in OnrereateView für meine App ausgeführt wird. Auch die Dinge auf meinem Server werden überprüft und was nicht auch ist, so dass es wirklich keinen Grund gibt, dass sich die Orientierung geändert hat.

Hier ist, was ich bisher eingerichtet habe

Ich habe das über die Mainaktivität im Manifest

 android:configChanges="orientation|keyboardHidden"

Und dann benutze ich das in meinem Fragment

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
    getLayoutInflater(getArguments()).inflate(R.layout.main, null, false);
    Toast.makeText(getActivity(), "changed orientation", Toast.LENGTH_LONG).show();
}

Wenn ich die App ausführe und die Orientierung wechsle, sehe ich die Toastshow, aber das Layout ändert sich nie in der Landschaft. Deshalb entschied ich, dass Android vielleicht nicht erkannte, dass es in der Landschaft war, seit ich es überschrieben habe, aber das Layout in etwas Lächerliches wie ein Layout für einen Dialog zu ändern Infolgedessen weiß ich, dass etwas nicht mit dem Aufblasen des Layouts stimmt.

Jede Hilfe beim Ändern des Layouts, wenn sich die Orientierung in einem Viewpager geändert hat, wäre sehr geschätzt.

Vielen Dank!

War es hilfreich?

Lösung

1) Sie sollten alle Ihre Server-Überprüfungsroutinen und andere einmalige Operationen in Fragment OnCreate (), nicht OnCreateView (), einfügen. Wenn Sie während des Ladens eine Art "Laden ..." anzeigen müssen, würde ich empfehlen, eine zu verwenden Fragmentaktivität ein Layout mit mindestens a aufzublasen Framelayout Das enthält eine Grafikart "Laden ...". Zunächst wird die Fragmentaktivität OnCreate () ausgeführt, in der sie zuerst die anfängliche Ansicht aufblasen und dann das Fragment instanziieren. Setzen Sie den Server -Checking -Code in die OnCreate () des Fragments () und geben Sie dann jede Ansicht für dieses Fragment in der Methode "Its OnCreateView () auf. Hier ist ein Beispiel aus einem meiner Projekte, das einen Mikrofonknopf initialisiert, was wirklich ein Fragment ist:

<FrameLayout
       android:id="@+id/recorder_mic_fragment"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       />

Dann wird das Mikrofonfragment tatsächlich durch den folgenden Java -Code instanziiert:

// make the Mic button
FragmentManager fragMgr = getFragmentManager();
FragmentTransaction xact = fragMgr.beginTransaction();
if (null == fragMgr.findFragmentByTag(FRAG_TAG)) {
    xact.add(R.id.mic_button_frame, MicFragment.newInstance(queryType), FRAG_TAG).commit();
}

Frag_tag ist eigentlich ein eindeutiger Tag -Name, den Sie einer Fragmentinstanz geben, die sich von der R.ID des Fragments unterscheidet. Auf diese Weise können Sie FindFragmentByTag () verwenden, um sicherzustellen, dass Fragmente an allen Orten, an denen Sie sie benötigen, korrekt instanziiert werden.

Sie können diesen Code ein wenig massieren, wenn Sie Fragmente in Fragmenten laden möchten, z. B. wie meine Anwendung tatsächlich funktioniert. Wenn Sie ein Fragment haben, das eine von mehreren möglichen Ansichten aufblasen, verwenden Sie eine IF -Anweisung, um die entsprechende Rahmen -ID auszuwählen und einen eindeutigen Frag_Tag zu bezeichnen. Ich würde empfehlen, für jeden Framelayout, den Sie für ein Fragment erstellen, bestimmte R.IDs zu verwenden. (Wenn dieses Fragment zum Beispiel verschiedene Ansichten für Informationen, Summen und Texte aufblasen könnte, wäre meine Tag -Namen für jedes Mikrofonfragment Metamicbutton, Hummicbutton, und LyricsMicbutton. Ich müsste auch zwischen r.id.meta_mic_button_frame usw. wählen.)

2) Wenn Sie zwischen Porträt- und Landschaftsmodi wechseln, müssen Sie verschiedene XML -Layouts in den Ordnern res/layout und res/layout_land definieren. (Oder Sie können Res/Layout und res/layout_port machen, wenn Sie den Landschaftsmodus als Standard betrachten möchten). Bitte überprüfen Sie diesen Link: http://developer.android.com/guide/topics/resources/providing-resources.html#alternativeresources Sie können verschiedene Layouts basierend auf Bildschirmgröße, Sprache, Dockmodus, Nachtmodus und beliebiger Kombination definieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top