b0mmell Geschrieben 4. März 2014 Geschrieben 4. März 2014 (bearbeitet) Hallo, ich möchte gerne einen NavigationDrawer einblenden, der aber nur beim Wechsel in den Portrait Modus erscheinen soll. Im Landscape Modus möchte ich Fragment A und Fragment B nebeneinander darstellen, im Portrait Modus dann Fragment A als NavigationDrawer einblenden. Leider funktioniert es nicht wirklich. Kann mir vielleicht jemand weiterhelfen? Hier ist mein Code : MainActivity: package com.example.navigationdrawerdemoapp; import android.os.Bundle; import android.app.Activity; import android.content.res.Configuration; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.view.Menu; import android.view.View; import android.widget.ListView; public class NavigationDrawerMainActivity extends FragmentActivity { private DrawerLayout myDrawerLayout; private ListView myDrawerList; int myOrientation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigation_drawer_main); if (myOrientation == 1) { FragmentA fragmentleft = new FragmentA(); FragmentB fragmentright = new FragmentB(); FragmentTransaction transaction1 = getSupportFragmentManager() .beginTransaction(); FragmentTransaction transaction2 = getSupportFragmentManager() .beginTransaction(); transaction1.replace(R.id.framelayout_left, fragmentleft); transaction2.replace(R.id.framelayout_right, fragmentright); transaction1.commit(); transaction2.commit(); } else if (myOrientation == 2) { createNavigationDrawer(); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); int orientation = newConfig.orientation; switch (orientation) { case Configuration.ORIENTATION_LANDSCAPE: myOrientation = 1; break; case Configuration.ORIENTATION_PORTRAIT: myOrientation = 2; break; } } private void createNavigationDrawer() { myDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); myDrawerList = (ListView) findViewById(R.id.framelayout_left_drawer); // myDrawerLayout.setVisibility(View.VISIBLE); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.navigation_drawer_main, menu); return true; } } Portrait XML <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/framelayout_right" android:layout_width="match_parent" android:layout_height="match_parent" /> <ListView android:id="@+id/framelayout_left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#111" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> </android.support.v4.widget.DrawerLayout> Landscape XML <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".NavigationDrawerMainActivity" > <FrameLayout android:id="@+id/framelayout_left" android:layout_width="500dp" android:layout_height="fill_parent" android:layout_alignParentLeft="true"/> <FrameLayout android:id="@+id/framelayout_right" android:layout_width="300dp" android:layout_height="fill_parent" android:layout_alignParentRight="true" /> </RelativeLayout> Vielen Dank schon einmal im Voraus Bearbeitet 4. März 2014 von Klotzkopp Zitieren
Klotzkopp Geschrieben 4. März 2014 Geschrieben 4. März 2014 Leider funktioniert es nicht wirklich.Das zeigt sich konkret wie? Zitieren
SilentDemise Geschrieben 4. März 2014 Geschrieben 4. März 2014 Warum benutzt du keine Code Tags? Zitieren
b0mmell Geschrieben 4. März 2014 Autor Geschrieben 4. März 2014 (bearbeitet) Das zeigt sich konkret wie? Sobald ich in den Portrait-Modus wechsle, bricht die App ab. Warum benutzt du keine Code Tags? Sorry, habe jetzt gerade erst gesehen, dass es diese gibt. Ich werde sie beim nächsten Mal benutzen @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); int orientation = newConfig.orientation; switch (orientation) { case Configuration.ORIENTATION_LANDSCAPE: myOrientation = 1; break; case Configuration.ORIENTATION_PORTRAIT: myOrientation = 2; break; } } myOrientation ist an der Stelle hier schon leer, laut Debugger Bearbeitet 4. März 2014 von b0mmell Zitieren
Klotzkopp Geschrieben 4. März 2014 Geschrieben 4. März 2014 Was heißt denn leer? Wie kann ein int leer sein? Zitieren
b0mmell Geschrieben 4. März 2014 Autor Geschrieben 4. März 2014 Ich meine natürlich 0, sorry. Zitieren
Klotzkopp Geschrieben 4. März 2014 Geschrieben 4. März 2014 Ohne wirklich Ahnung von Android-Entwicklung zu haben: Du solltest myOrientation schon irgendwie sinnvoll initialisieren. Du kannst nicht abwarten, bis onConfigurationChanged kommt. myOrientation ist nicht schon 0, es ist noch 0. Zitieren
b0mmell Geschrieben 4. März 2014 Autor Geschrieben 4. März 2014 Ohne wirklich Ahnung von Android-Entwicklung zu haben: Du solltest myOrientation schon irgendwie sinnvoll initialisieren. Du kannst nicht abwarten, bis onConfigurationChanged kommt. Ich habe myOrientation jetzt den Wert 1 gegeben, aber es ändert ja nichts daran, dass der Wert in switch-case Anweisung nicht überschrieben wird Zitieren
Klotzkopp Geschrieben 4. März 2014 Geschrieben 4. März 2014 Was heißt, der Wert wird nicht überschrieben? Zitieren
pr0gg3r Geschrieben 4. März 2014 Geschrieben 4. März 2014 Hast du in deiner Activity android:configChanges = "orientation" drin? Zitieren
b0mmell Geschrieben 4. März 2014 Autor Geschrieben 4. März 2014 } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); int orientation = newConfig.orientation; switch (orientation) { case Configuration.ORIENTATION_LANDSCAPE: myOrientation = 1; break; case Configuration.ORIENTATION_PORTRAIT: myOrientation = 2; break; } } Hier sollte ja eigentlich eine neue Wertzuweisung erfolgen, sodass ich in der IF-Abfrage "myOrientation" überprüfen kann. Ich habe es jetzt so abgeändert, und es funktioniert soweit, dass ich in der Log ausgegeben bekomme, dass ich im Portrait-Modus bin. Allerdings habe ich es noch nicht geschafft, wie ich nun das linke Fragment als ListView einfliegen lassen kann? @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); orientation = newConfig.orientation; switch (orientation) { case Configuration.ORIENTATION_LANDSCAPE: FragmentA fragmentleft = new FragmentA(); FragmentB fragmentright = new FragmentB(); FragmentTransaction transaction1 = getSupportFragmentManager() .beginTransaction(); FragmentTransaction transaction2 = getSupportFragmentManager() .beginTransaction(); transaction1.replace(R.id.framelayout_left, fragmentleft); transaction2.replace(R.id.framelayout_right, fragmentright); transaction1.commit(); transaction2.commit(); break; case Configuration.ORIENTATION_PORTRAIT: createNavigationDrawer(); Log.d("TEST", "Portrait"); break; } } So lange ich das DrawerLayout als invisible habe, funktioniert es. Sobald ich es aber sichtbar mache, kommt der Fehler, dass ich ein FrameLayout nicht zu einer ListView casten kann. Wie kann ich das jetzt realisieren? Mein FragmentA ist eine ListView, doch wie mach ich jetzt, dass die ListView, welche das DrawerLayout enthält dieses FragmentA als Inhalt benutzt? Danke schonmal Zitieren
b0mmell Geschrieben 5. März 2014 Autor Geschrieben 5. März 2014 package com.example.navigationdrawerdemoapp; import android.os.Bundle; import android.app.Activity; import android.content.res.Configuration; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.FrameLayout; import android.widget.ListView; public class NavigationDrawerMainActivity extends FragmentActivity { private DrawerLayout myDrawerLayout; private FrameLayout myDrawerList; int orientation = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_navigation_drawer_main); includeFragments(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); orientation = newConfig.orientation; switch (orientation) { case Configuration.ORIENTATION_LANDSCAPE: includeFragments(); break; case Configuration.ORIENTATION_PORTRAIT: myDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); myDrawerList = (FrameLayout) findViewById(R.id.left_drawer); FragmentB fragmentB = new FragmentB(); FragmentTransaction transPortr = getSupportFragmentManager().beginTransaction(); transPortr.replace(R.id.container, fragmentB); transPortr.commit(); FragmentA fragmentA = new FragmentA(); FragmentTransaction transPortrA = getSupportFragmentManager().beginTransaction(); transPortrA.replace(R.id.left_drawer, fragmentA); transPortrA.commit(); Log.d("TEST", "Portrait"); break; } } private void includeFragments() { ContainerFragment fragmentCont = new ContainerFragment(); FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); trans.replace(R.id.container, fragmentCont); trans.commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.navigation_drawer_main, menu); return true; } } In der LogCat bekomme ich jetzt angezeigt, in welchem Modus ich mich befinde. Allerdings bekomme ich den Drawer nicht reingewischt Zitieren
b0mmell Geschrieben 7. März 2014 Autor Geschrieben 7. März 2014 Ich habe jetzt nochmals eine Test-App erstellt, welche nun auch funktioniert. Allerdings habe ich jetzt die beiden Fragmente nicht in einem Contaier, inflate sie also direkt in der MainActivity, was ich ja bei der richtigen App eigentlich nicht möchte. Weiß jemand vielleicht, wie es doch mithilfe eines Containers geht? Hier mal der Code: MainActivity: package com.example.uitestapp; import android.os.Bundle; import android.app.Activity; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.view.Menu; public class MainActivity extends FragmentActivity { FragmentLeft myLeftFragment = new FragmentLeft(); FragmentRight myRightFragment = new FragmentRight(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); includeFragment(myLeftFragment, R.id.container_left); includeFragment(myRightFragment, R.id.container_right); } private void includeFragment(Fragment fragment, int viewID) { FragmentTransaction transLeft = getSupportFragmentManager() .beginTransaction(); transLeft.replace(viewID, fragment).commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } Portrait XML: <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- Main Content --> <FrameLayout android:id="@+id/container_right" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <!-- Drawer --> <FrameLayout android:id="@+id/container_left" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#111" /> </android.support.v4.widget.DrawerLayout> Layout Landscape <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <FrameLayout android:id="@+id/container_left" android:layout_width="300dp" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_centerVertical="true" /> <FrameLayout android:id="@+id/container_right" android:layout_width="500dp" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:layout_centerVertical="true" /> </RelativeLayout> Die Fragmente sind in diesem Beispiel noch ohne Inhalt, ich habe also einfach nur zum Test einen Hintergrund erstellt. Jetzt möchte ich aber in der Main statt der beiden FrameLayouts nur ein Layout, in dem ich dann ein Container-Fragment inflate, welches die beiden anderen Fragmente beinhalten soll. Beim Wechsel in den Portrait Modus soll dieses durch FragmentB ersetzt werden und FragmentA in den Container. Außerdem hätte ich noch die Frage, ob es vielleicht gute Quellen um an Android Informationen zu kommen, gibt. Im Android IRC Channel ist leider nicht wirklich viel los und gute Foren scheint es auch nicht zu geben, oder irre ich mich da ? Ich würde mich über Tipps sehr freuen Viele Grüße, Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.