Layout ändern, während Sie die Ausrichtung ändern, die zur Laufzeit in einem fragment ohne die Neuerstellung der Ansicht
Ich versuche zu entwickeln, um eine erste app, die das herunterladen von Bildern aus dem Netz und zeigen Sie in einem gridview. Das gridview ist ein fragment einer Haupttätigkeit. Der download-Prozess wird mit einem AsyncTask in der onCreate-Funktion. Um nicht erneut herunterladen der Bilder, während die Orientierung ändern, habe ich die android:configChanges="orientation|screenSize"
im Android-Manifest. Dann in der onCreate-Funktion ist der Aufruf nur einmal und alles ist gut ... außer, dass ich habe ein paar änderungen im layout für das gridview-fragment im Querformat. So habe ich 2 layout-Blatt : fragment_library.xml
und fragment_library_land.xml
im layout/Ordner. Zu diesen änderungen arbeiten, ich habe versucht, das layout zu verändern von der Bibliothek fragment manuell mithilfe der onConfigurationChanged Funktion. Zur Laufzeit des Programms bewerten Sie die Funktion auf und übergeben im guten Fall (hochformat oder Querformat), aber das layout ist immer noch das man für den portrait-Modus : fragment_library.xml
...
public class LibraryFragment extends Fragment {
public GridView gridview;
private Boolean isImageAdapterPopulated = false;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
GetLibraryTask getLibraryTask = new GetLibraryTask(this);
getLibraryTask.execute(Config.URL + "action=getLibrary");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null)
return null;
//gridview
View V = inflater.inflate(R.layout.fragment_library, container, false);
gridview = (GridView)V.findViewById(R.id.gridview);
if(this.isImageAdapterPopulated)
this.setGridAdapter();
return V;
}
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
inflater.inflate(R.layout.fragment_library_land, null);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService( Context.LAYOUT_INFLATER_SERVICE );
inflater.inflate(R.layout.fragment_library, null);
}
}
public void setGridAdapter(){
this.isImageAdapterPopulated = true;
gridview.setAdapter(new ImageAdapter(getActivity()));
}
//...
}
fragment_library.xml
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:cacheColorHint="@android:color/transparent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="200dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="20dp"
android:stretchMode="columnWidth"
android:gravity="bottom"
/>
fragment_library_land.xml
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:cacheColorHint="@android:color/transparent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="400dp"
android:numColumns="2"
android:verticalSpacing="50dp"
android:horizontalSpacing="50dp"
android:stretchMode="columnWidth"
android:gravity="bottom"
/>
Danke für die Hilfe 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es nicht möglich. Ein Fragment kann nicht aktualisieren, das layout dynamisch. Sie haben einige andere Optionen, aber.
1. Nicht ein fan von dieser, aber Sie kann einen Fragment-layout mit sowohl den portrait-und den horizontalen Ansichten gleichzeitig und ein-und ausblenden.
fragment_library.xml:
Dann einige private member-Variablen:
Dann in
onConfigurationChanged(Configuration newConfig)
:Einige Punkte: Beachten Sie, dass ich Links aus dem code zu verweisen, die beide GridViews. Ich habe auch Ihre GridView zu privaten und auch der name geändert, um mGridView*. Privat zu halten "Daten-encapsulated" und "m" denn es ist ein Mitglied der Klasse, nur Konvention. Ich habe auch den if-else-Klausel, da wollte ich die portrait-check an Erster Stelle.
Dieser Weg ist der Schnellste und einfachste, jedoch könnte es schwer werden für das system, wenn Sie haben große layouts so tun nicht verwenden Sie dies, wenn Sie viele Dinge. Vorzugsweise verwenden Sie nicht dieses Konzept auf allen.
2. Der richtige Weg ist, lassen Sie die Andorid kümmern sich um die Orientierung und auch bewegen Sie Ihre XML-zu Recht-Verzeichnis. Dies wird jedoch die Wiederherstellung des Fragments (soweit Sie nicht
setRetainInstance(true);
die Sie nicht in diesem Fall; dadurch wird das Fragment nicht neu, es ist layout (eigentlich auf der Suche bis die retain-Methode es nicht erwähntonCreateView
so können Sie versuchen, diese zu wahren und aswell versuchen)).Bewegen Sie Ihre fragment_library_land.xml das Verzeichnis layout-land statt layout und nennen Sie es " fragment_library.xml. Hinweis: das Fett, es wird den gleichen Namen, bleiben aber in verschiedenen Verzeichnissen. Auf diese Weise wird Android kennen und nehmen Sie die richtige layout basierend auf der Ausrichtung.
Wenn ich verstanden habe, warum Sie nicht wollen, zu reproduzieren, ist das Fragment, weil
onCreate(Bundle savedInstanceState)
wird wieder aufgerufen werden (mitsetRetainInstance(true);
es nicht und als Rücksicht auf das, was ich früher schrieb, Sie können es versuchen) so erstellen Sie eine neue Instanz vonGetLibraryTask
und laden Sie die Bilder erneut. Dies könnte verhindert werden, wenn Sie verwendet eine Datenbank zum speichern der Bilder und wenn Sie hatte ein boolescher Wert, der immer den überblick wenn Sie das image heruntergeladen haben oder nicht. InGetLibraryTask
würden Sie dann wählen Sie die Bilder, die nicht heruntergeladen wird, werden es die erste Zeit, die der task ausgeführt wird oder wenn die Ausrichtung geändert. Sie müssten auch in einen stop-check in der Bibliothek Aufgabe in der download-Schleife, die vor jedem Element überprüft, ob Sie sollen das Bild herunterladen, oder wenn das fragment ist nicht mehr verfügbar und somit beenden Sie die Aufgabe.Nun, wenn Sie ändern Sie die Ausrichtung der Tätigkeit wird neu die LibraryFragment und je nach Ausrichtung entweder layout oder layout-land verwendet werden.
Einige Randnotizen in Ihrem code:
public GridView gridview
wäreprivate GridView mGridView
undprivate Boolean isImageAdapterPopulated
wäreprivate boolean mIsImageAdapterPopulated
onConfigurationChanged(Configuration newConfig)
Sie aufblasen, eine XML-und es gibt eine Aussicht, aber Sie sind nicht etwas zu tun mit esIch Wünsche dir viel Glück!
Ist es möglich, wenn Sie oncongi-change-Methode.
bitte finden Sie unter diesem link Ändern Sie das Fragment-layout auf die Ausrichtung ändern