android.support.v4.app.FragmentManager ODER android.app.FragmentManager?
-
21-12-2019 - |
Frage
Ich lerne Android-Entwicklung.Ich bleibe bei etwas hängen, das eigentlich ganz einfach sein sollte.
Ich erstelle eine App mit einer Aktivität, 2 Fragmenten und 1 Schnittstelle.
android:minSdkVersion="11"
android:targetSdkVersion="19
In der Hauptaktivität versuche ich also, mithilfe des Managers einen Verweis auf Fragment B zu erstellen.Ich stecke hier fest, weil Eclispse mir sagt, ich solle einige Dinge ändern (siehe unten):
Meine Absicht:`
@Override
public void respond(int i) {
// TODO Auto-generated method stub
FragmentManager manager =getFragmentManager();
FragmentB f2= (FragmentB) manager.findFragmentById(R.id.fragment2);
}`
Wenn ich es auf diese Weise mache, erhalte ich Fehlermeldungen und muss einige Änderungen vornehmen.Nach den Änderungen sieht der Code so aus (und ich kann FragmentB immer noch nicht erreichen):
@Override
public void respond(int i) {
// TODO Auto-generated method stub
android.app.FragmentManager manager =getFragmentManager();
android.app.Fragment f2= manager.findFragmentById(R.id.fragment2);
}
Für zusätzliche Details füge ich hier auch den Import-Header der Aktivität ein:
package com.example.modular_ui;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
public class MainActivity extends Activity implements Communicator{....
Was fehlt mir hier?Die ganze Sache mit support.v4/support.v7 ist für Anfänger etwas verwirrend.
BEARBEITEN:Nach dem Wechsel zu:
import android.app.Fragment;
import android.app.FragmentManager;
UND durch Erweitern von FragmentActivity kann ich immer noch keinen Verweis auf FragmentB erstellen:
@Override
public void respond(int i) {
// TODO Auto-generated method stub
FragmentManager man = getFragmentManager();
FragmentB b = man.findFragmentById(R.id.fragment2);
}
Wie gewünscht habe ich den FragmentB-Code gepostet:
package com.example.modular_ui;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class FragmentB extends Fragment {
TextView text;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment_b, container);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
text = (TextView) getActivity().findViewById(R.id.textView1);
}
Haupt-XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.modular_ui.MainActivity"
tools:ignore="MergeRootFrame" >
<fragment
android:id="@+id/fragment1"
android:name="com.example.modular_ui.FragmentA"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<fragment
android:id="@+id/fragment2"
android:name="com.example.modular_ui.FragmentB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/fragment1"
android:layout_marginTop="54dp" />
</RelativeLayout>
Lösung
Zunächst einmal: Ihre Aktivität sollte die Fragmentierbarkeit erweitern.
Über Support-Bibliotheken.Sie wurden eingeführt, um ältere Androiden einiger Funktionalitäten hinzuzufügen.Zum Beispiel wurden Fragmente in Android 3.0 (SDK NR: 11) eingeführt.In der Tat (je nach Dokumentation) in Androids 3.0
Andere Tipps
Verwenden Sie einfach GetsUpportFragmentManager ();, nachdem Sie die Support-Bibliothek erfolgreich hinzugefügt haben.
op war so nah an einer Lösung, die für die API 11 und neuer ohne Bedarf unterstützt. V4 .
Er musste nur sein
Zusammenfassung der beiden Ansätze. Alle Ihre Aktivitäten und Fragmente sollten Code verfügen, der wie genau
support-v4-Ansatz
generasacodicetagpre.API 11+ Ansatz
generasacodicetagpre.Wenn Sie also ein Projekt haben, das mit einem oben genannten Ansatz geschrieben wird, und Sie integrieren Sie in anderswo in den Code, suchen Sie unbedingt nach diesen Zeilen und ändern Sie sie, um das, was Sie haben, anpassen.
Es ist einfach.
Wenn Sie möchten, dass Ihre App auch auf älteren Geräten (unter API-Level 11) läuft, verwenden Sie getSupportFragmentManager()
.
Wenn Sie möchten, dass Ihre App auf Geräten mit API-Level über 11 ausgeführt wird, verwenden SiegetFragmentManger()
.