web-dev-qa-db-fra.com

android.support.v4.app.FragmentManager OR Android.app.FragmentManager?

J'apprends le développement Android. Je suis coincé dans quelque chose qui devrait être très facile.

Je crée une application avec une activité, 2 fragments et une interface.

Android:minSdkVersion="11"
Android:targetSdkVersion="19

Donc, dans l'activité principale, j'essaie de créer une référence au fragment B en utilisant le gestionnaire. Je suis coincé ici, car Eclispse me dit de changer certaines choses (voir ci-dessous):

Mon intension:

@Override
    public void respond(int i) {
        // TODO Auto-generated method stub

    FragmentManager manager =getFragmentManager();
    FragmentB f2= (FragmentB) manager.findFragmentById(R.id.fragment2);

}`

Si je le fais aussi bien, j’obtiens les messages d’erreur et dois effectuer certaines modifications. Après les modifications, le code ressemble à ceci (et je ne parviens toujours pas à atteindre FragmentB):

    @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);

}

Pour plus de détails, je mettrai ici aussi l'en-tête d'importation de l'activité:

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

Qu'est-ce que j'oublie ici? la chose entière support.v4 /support.v7 est un peu déroutante pour les débutants.

EDIT: Après passage à:

    import Android.app.Fragment;
import Android.app.FragmentManager;

ET extension de FragmentActivity Je ne peux toujours pas créer de référence à FragmentB:

@Override
public void respond(int i) {
    // TODO Auto-generated method stub

FragmentManager man = getFragmentManager();
FragmentB b = man.findFragmentById(R.id.fragment2);

}

Comme demandé, j'ai posté le code FragmentB:

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);
    }

XML principal

<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>
8
Foo

Tout d’abord: votre activité doit s’étendre sur FragmentActivity.

À propos des bibliothèques de support. Ils ont été introduits pour ajouter des fonctionnalités aux androïdes plus anciens. Par exemple, les fragments ont été introduits dans Android 3.0 (SDK n °: 11). En fait (selon la documentation) dans Androids 3.0 <support libary utilise la mise en oeuvre système de Fragments.

4
RobertM

Il suffit d'utiliser getSupportFragmentManager (); , après avoir ajouté la bibliothèque de support avec succès.

9
bgauryy

OP était si proche d’une solution qui aurait bien fonctionné pour l’API 11 et les versions plus récentes sans avoir besoin de support.v4 .

Il avait simplement besoin de changer son fragment pour qu'il n'utilise pas non plus support.v4, dans son instruction import.

Résumé des deux approches. TOUTES vos activités et tous les fragments devraient avoir un code qui ressemble exactement à un de ceux-ci; ne les mélangez pas! (Toutes les lignes ne sont pas nécessaires dans tous les fichiers; utilisez-les au besoin.)

approche de support-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

Approche API 11+

import Android.app.Activity;
import Android.app.Fragment;
import Android.app.FragmentManager;

... MainActivity extends Activity ...

... = getFragmentManager();

.... YourFragment extends Fragment ... <-- same in both approaches

Donc, si vous avez un projet écrit en utilisant une approche ci-dessus et que vous intégrez du code provenant d’ailleurs, veillez à rechercher ces lignes et à les modifier pour les faire correspondre à ce que vous avez.

6
ToolmakerSteve

C'est simple.

Si vous souhaitez également que votre application s'exécute sur des appareils plus anciens (inférieurs au niveau 11 de l'API), utilisez getSupportFragmentManager().

Si vous souhaitez que votre application s'exécute sur des appareils dotés d'un niveau API supérieur à 11, utilisez getFragmentManger().

2
suresh yadam