Obtenir Fragment par Tag
Je suis à l'aide d'un FragmentPagerAdapter pour créer un multi-pages de l'INTERFACE utilisateur avec les différents fragments. Ce que je veux faire est de trouver le Fragment à l'aide de la position du Fragment.
J'ai appliqué la méthode de trouver le nom de fragments et de les utiliser .FindFragmentbyTag (), mais l' .FindFragmentbyTag toujours me rendre la valeur null. La structure semble être correct donc je ne sais pas pourquoi j'obtiens des valeurs null, s'il vous plaît regarder à travers et l'aide est appréciée.
Voici le code
MainActivity.java
public void onCreate(Bundle savedInstanceState) {
this.getSupportFragmentManager();
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MainActivity.instance=this;
//Initialize pager
vpPager = (ViewPager)findViewById(R.id.mypager);
pagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
vpPager.setAdapter(pagerAdapter);
this.mapFragment = (MapFragment)this.findFragmentByPosition(0);
this.drFragment = (DRFragment)this.findFragmentByPosition(1);
this.sensorFragment = (SensorFragment)this.findFragmentByPosition(2);
......
}
protected Fragment findFragmentByPosition(int position) {
int pagerid = this.vpPager.getId();
long pagerAdapterid = this.pagerAdapter.getItemId(position);
return getSupportFragmentManager().findFragmentByTag("android:switcher:" + pagerid + ":" + pagerAdapterid + "");
}
MyPagerAdapter.java
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.View;
public class MyPagerAdapter extends FragmentPagerAdapter {
private static final String TAG = "TM_PageAdapter";
private static int numItems = 3;
public MyPagerAdapter(FragmentManager fragmentManager){
super(fragmentManager);
}
public int getCount() {
return numItems;
}
@Override
public Fragment getItem(int position) {
switch(position){
case 0:
return MapFragment.newInstance(0, "Map Information");
case 1:
return DRFragment.newInstance(1, "DR Information");
case 2:
return SensorFragment.newInstance(2, "Sensor Information");
default:
return null;
}
}
@Override
public CharSequence getPageTitle(int position) {
switch(position){
case 0:
return "Map Information";
case 1:
return "DR Information";
case 2:
return "Sensor Information";
default:
return null;
}
}
public static String makeFragmentName(int viewId, int index) {
return "android:switcher:" + viewId + ":" + index;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == ((View) arg1);
}
@Override
public Parcelable saveState() {
return null;
}
Ici est celui du code de la .newInstance:
public static MapFragment newInstance(int position, String title){
MapFragment mapFragment = new MapFragment();
Bundle args = new Bundle();
args.putInt("current_page", 0);
args.putString("page_tile", "Map Information");
mapFragment.setArguments(args);
return mapFragment;
}
Je ne vois pas ce que vous les appelez makeFragmentName(...) n'importe où. Pouvez-vous donner un code comme le contenu de MapFragment.newInstance(...)?
J'ai ajouté le code de la partie .newInstnce, C'est ma première fois de travailler avec FragmentPagerAdapter donc j'ai plutôt tendance à suivre le tutoriel en ligne. Je risque de manquer une partie importante (je ne soupçonnais). Montrez-moi où je m'ennuie, je vous remercie 🙂
De ce que je vois, vous n'appelez pas la makeFragmentName(), de sorte que les fragments n'aurez pas de balises. C'est une raison pour laquelle findFragmentByTag() n'en trouverez pas. Aussi, vous n'avez pas à ajouter de la viewId à la balise. Juste l'index devrait être suffisant.
Voici ce que j'ai reçu de l'autre post: stackoverflow.com/questions/11976397/... Les Fragments fournis par le FragmentPagerAdapter sont auto-tagged quand ils sont instanciés. Vous pouvez récupérer le tag avec cette méthode: .... N'est donc pas la fonction findFragmentbyPosition(position) dans le MainActivity faire l'affaire? Je pense que j'ai appliqué à la fois de la réponse sur cette page et j'ai oublié de supprimer un
et ThomasDang, semble que le problème était ailleurs, débarrassons-nous de tous ces commentaires inutiles.
J'ai ajouté le code de la partie .newInstnce, C'est ma première fois de travailler avec FragmentPagerAdapter donc j'ai plutôt tendance à suivre le tutoriel en ligne. Je risque de manquer une partie importante (je ne soupçonnais). Montrez-moi où je m'ennuie, je vous remercie 🙂
De ce que je vois, vous n'appelez pas la makeFragmentName(), de sorte que les fragments n'aurez pas de balises. C'est une raison pour laquelle findFragmentByTag() n'en trouverez pas. Aussi, vous n'avez pas à ajouter de la viewId à la balise. Juste l'index devrait être suffisant.
Voici ce que j'ai reçu de l'autre post: stackoverflow.com/questions/11976397/... Les Fragments fournis par le FragmentPagerAdapter sont auto-tagged quand ils sont instanciés. Vous pouvez récupérer le tag avec cette méthode: .... N'est donc pas la fonction findFragmentbyPosition(position) dans le MainActivity faire l'affaire? Je pense que j'ai appliqué à la fois de la réponse sur cette page et j'ai oublié de supprimer un
et ThomasDang, semble que le problème était ailleurs, débarrassons-nous de tous ces commentaires inutiles.
OriginalL'auteur Thomas Dang | 2014-07-17
Vous devez vous connecter pour publier un commentaire.
Dans findFragmentByPosition, vous n'êtes pas à l'aide de l'index, pour la recherche du fragment:
Le second doit être l'indice, pas la pagerAdapterId. Donc le bon code serait:
Il n'y a pas non plus besoin de concaténer la dernière chaîne vide.
La fonction: long pagerAdapterid = ce.pagerAdapter.getItemId (); donnerait exactement la même chose que la position (j'ai utilisé le mode de débogage et de trouver) donc c'est pas le problème. J'ai également double vérifier en modifier le code en fonction de votre réponse. encore pointeur null @@. Mais merci pour l'aide
Vous êtes juste en ajoutant une étape supplémentaire alors 🙂 Il est également possible, que vous le fragment n'existe tout simplement pas, parce qu'il n'est pas visible, et a été détruit. Vous pouvez augmenter la quantité de fragments stockés avec ViewPager.setOffscreenPageLimit(int pages);
Il est également possible, que la ViewPager n'a pas créé les fragments encore, parce que vous êtes le référencement dès que vous la valeur de la carte. SensorFragment sera sûrement nulle, parce que le pager charge le premier fragment, et un de plus dans l'arrière-plan.
Vous n'êtes pas les références, vous essayez d'obtenir une référence pour eux. Vous pouvez utiliser un ViewPager.OnPageChangeListener et demandez la référence dans onPageSelected(int position).
OriginalL'auteur Daniel Zolnai
J'ai utilisé cette approche dans le passé et cela a fonctionné assez bien.
De votre carte, vous pouvez déclarer une variable d'instance comme suit:
Dans votre getItem() mettre une référence du fragment dans la carte
Remplacer la InstantiateItem méthode:
Remplacer la onDestroyItem pour nettoyer les références:
Et enfin obtenir le fragment en fonction de sa position:
Espère que cela aide.
OriginalL'auteur AlexBalo
Il semble que la chose qui a causé ma référence pour aller nulle car le Chargement des fragments se fait en tâche de fond et quand j'référence à ces fragments le chargement n'est pas encore complète (Merci Daniel Zolnai pour poiting, je voudrais vous donner un droit de réponse de la tique si u mettre comme réponse)
Mes pensées pour la solution est maintenant:
-Charger toutes les pages que vous avez si le nombre de pages sont de petite taille à l'aide de (ViewPager).setOffScreenLimit(int limite)
-Pause de l'activité principale et attendre jusqu'à ce que toutes les pages sont chargées puis continuer sur.
Maintenant je suis bloqué à la deuxième partie, si quelqu'un sait comment faire pour attendre ou de retarder l'MainActivty pour le chargement des pages de compléter ou de forcer le chargement en tâche de premier plan, il serait d'une grande aide pour moi, merci
OriginalL'auteur Thomas Dang