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>
.

È stato utile?

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().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top