android.support.v4.app.fragmentmanager o android.app.fragmentmanager?
-
21-12-2019 - |
Domanda
Sto imparando lo sviluppo Android. Mi sono bloccato a qualcosa che dovrebbe essere molto facile.
IM Creazione di un'app con un'attività, 2 frammenti e 1 interfaccia.
android:minSdkVersion="11"
android:targetSdkVersion="19
.
Quindi nell'attività principale sto cercando di creare un riferimento al frammento B usando il gestore. Mi sono bloccato qui, perché Eclispse mi sta dicendo di cambiare alcune cose (vedi sotto):
La mia intenzione: `
@Override
public void respond(int i) {
// TODO Auto-generated method stub
FragmentManager manager =getFragmentManager();
FragmentB f2= (FragmentB) manager.findFragmentById(R.id.fragment2);
}`
.
Se lo faccio questo, ottengo i messaggi di errore e ho bisogno di eseguire alcune modifiche. Dopo le modifiche il codice sembra questo (e non riesco ancora a raggiungere frammentb):
@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);
}
.
Per dettagli extra, metterò anche qui l'intestazione dell'importazione dell'attività:
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{....
.
Cosa mi manca qui? L'intero supporto.v4 /support.v7 è un po 'confuso per i principianti.
Modifica: Dopo il passaggio a:
import android.app.Fragment;
import android.app.FragmentManager;
.
e estendere la frammentazione ancora non riesco a creare un riferimento a frammentb:
@Override
public void respond(int i) {
// TODO Auto-generated method stub
FragmentManager man = getFragmentManager();
FragmentB b = man.findFragmentById(R.id.fragment2);
.
}
Come richiesto il codice frammentb:
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);
}
.
Principale 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>
. Soluzione
Prima di tutto: la tua attività dovrebbe estendere la frammentazione.
Informazioni sulle librerie di supporto.Sono stati introdotti per aggiungere alcune funzionalità ai più anziani Androids.Ad esempio i frammenti sono stati introdotti in Android 3.0 (SDK NR: 11).Infatti (secondo la documentazione) in Androids 3.0
Altri suggerimenti
Basta usare getospportfragmentmanager ();, dopo aver aggiunto la libreria di supporto con successo.
OP è stato così vicino ad avere una soluzione che avrebbe funzionato bene per API 11 e Newer senza bisogno di supporto.v4 .
Aveva solo bisogno di cambiare il suo frammento per non utilizzare il supporto.V4, nella sua istruzione Import .
Riassunto dei due approcci. Tutte le tue attività e frammenti dovrebbero avere il codice che assomiglia esattamente a One di questi;Non mescolarli!(Non sono necessarie tutte le linee in tutti i file; utilizzare linee secondo necessità.)
approccio di supporto-v4
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.Fragment; <-- ".support.v4"
import android.support.v4.app.FragmentManager;
... MainActivity extends FragmentActivity ...
... = getSupportFragmentManager();
.... YourFragment extends Fragment ... <-- same in both approaches
.
API 11+ Approccio
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
... MainActivity extends Activity ...
... = getFragmentManager();
.... YourFragment extends Fragment ... <-- same in both approaches
.
.
Quindi se hai un progetto che è scritto utilizzando un approccio sopra, e ti stai integrando in codice da altrove, assicurati di cercare queste righe e cambiarli per abbinare ciò che hai.
È semplice.
Se vuoi anche la tua app da eseguire in dispositivi precedenti (sotto il livello dell'API 11), utilizzare getSupportFragmentManager()
.
Se si desidera che la tua app funzioni in dispositivi con livello API sopra 11, quindi utilizzare
getFragmentManger()
.