47 votes

Comment changer la vue à l'intérieur d'un fragment?

J'ai un fragment qui crée son point de vue à l'intérieur de onCreateView comme vous le souhaitez. Cependant je veux changer la vue régulièrement.

Mon cas est que le fragment montre quelques données d'un service web. Lorsqu'un utilisateur choisit une option dans une liste (un autre fragment), ce fragment doit passer à une barre de progression, puis une fois chargé, revenez à la vue de données.

J'ai pu faire deux fragments de chargement fragment, et l'affichage fragment, mais il semble que, depuis cette est encapsulé cas, je préfère tout faire à l'intérieur d'un fragment.

Fondamentalement, ce que je me demande, est ce qui est l'équivalent de setContentView à l'intérieur d'un fragment.

33voto

bplayer Points 404

Vous pouvez utiliser Fragment.getView() . Ceci renvoie la vue du conteneur contenant les Fragment . Sur cette vue, vous pouvez appeler removeAllViews . Générez ensuite vos nouvelles vues et ajoutez-les à la vue que vous avez obtenue de getView() .

http://developer.android.com/reference/android/app/Fragment.html#getView ()

27voto

Solostaran14 Points 759

Si pour une raison quelconque, vous souhaitez changer l'ensemble du fragment de vue (par exemple, asynchrone de la demande d'URL qui va changer le point de vue sur le succès), vous pouvez soit utiliser le FragmentTransaction dans le parent de l'activité et de créer un nouveau fragment à la volée.

Ou vous pouvez garder le fragment et l'appel à une méthode de ce fragment qui va actualiser lui-même. Exemple: Dans le parent de l'activité, j'ai créer et stocker une liste de fragments List<RefreshFragment> mFragmentList.

Voici la RefreshFragment classe (et toutes mes fragments d'étendre celui-ci à mon exemple) :

public class RefreshFragment extends Fragment {
    protected Data data; // here your asynchronously loaded data

    public void setData(Data data) {
        this.data = data;
        // The reload fragment code here !
        if (this.isDetached()) {
            getFragmentManager().beginTransaction()
               .detach(this)
               .attach(this)
               .commit();
        }
    }
}

Ensuite dans mon activité de rappel asynchrone, je peux appeler :

for (RefreshFragment f : mFragmentList) f.setData(data);

Ainsi, chaque fragment sera mis à jour avec les données correctes et actuellement attaché fragment va se mettre à jour immédiatement. Vous devez fournir vous possédez onCreateView dans les fragments de cours.

L'important, c'est qu'un fragment peut se recharger avec getFragmentManager().

4voto

Philipp Reichart Points 10371

Vous pouvez utiliser un FrameLayout pour basculer entre votre barre de progression et la vue des données, par exemple

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageView android:id="@+id/cover_image"
        android:scaleType="fitCenter"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
    <ProgressBar android:id="@+id/cover_progress"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_gravity="center"/>
</FrameLayout>
 

En onViewCreate() vous stockeriez ensuite les deux vues dans des champs d'instance.

 public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
    ...
    image = (ImageView) container.findViewById(R.id.cover_image);
    progress = container.findViewById(R.id.cover_progress);
    ...
}
 

et chaque fois que vous souhaitez basculer entre les deux (rappelez-vous de le faire dans votre interface utilisateur / fil principal), faites simplement quelque chose comme:

 progress.setVisibility(View.INVISIBLE);
image.setVisibility(View.VISIBLE);
 

1voto

user1503361 Points 11

Vous pouvez utiliser Transaction remove and add. J'ai utilisé un fragment dans lequel je peux charger n'importe quelle vue. Le constructeur du fragment doit avoir un entier, cet entier est R.layout ... Je supprime simplement l'ancien fragment et en mets un nouveau. !!! Cela ne fonctionne que si vous faites de ce fragment une dynamique et non dans la mise en page XML. Créez simplement quelque chose comme un LinearLayout R.id.fragment_layout

 @Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.wundlist_fragmente);
    Log.v("WoundListActivity", "WoundListActivity gestartet...");

    Log.v("WoundListActivity", "Liste...");
    //dynamisch hinzufügen...
    wlf=new WoundListFragment();        
    fm.beginTransaction().add(R.id.fragment_layout,wlf).commit();

}

//If Menubutton Clicked change

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId()==R.id.itemaddwound){
        Log.v("List", "neue Wunde Activity");

        fm.beginTransaction().remove(wlf).commit();
        fm.beginTransaction().add(R.id.fragment_layout, new NewWoundFragment()).commit();

    }

    return super.onOptionsItemSelected(item);
}
 

1voto

IHeartAndroid Points 874

En utilisant la réponse de Solostaran14s, je le fais maintenant:

Interface:

 public interface FragmentReattachListener {

    public void reAttach();

}
 

Fragment:

 public class MyFragment extends Fragment implements  FragmentReattachListener {
//...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //...
    App.registerFragmentReattachListener(this);
    //...
}

//...    

@Override
public void reAttach() {
    FragmentManager f = getFragmentManager();
    if (f != null) {
         f.beginTransaction()
                    .detach(this)
                    .attach(this)
                    .commit();
        }
    }

}
 

de la classe d'application:

 private static void reattachFragments() {
        if (fragmentReattachListeners.size() > 0) {
            for (FragmentReattachListener listener : fragmentReattachListeners) {
                listener.reAttach();
            }
        }
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X