Comment passer fragment arguments lors de l'utilisation d'une vue pager avec différents fragments/layouts?
Objectif: Pour utiliser fragment arguments à passer le long de la chaîne de valeur à partir d'une TextView
à une nouvelle fragments TextView
, MAIS tout en utilisant un ViewPager
avec différents layouts/fragments
dans le FragmentPagerAdapter
.
Problème: Le nouveau fragment ne reçoit jamais les fragments les arguments du fragment précédent.
Mon Set up: j'ai mon Activity
d'hébergement de la ViewPager
et FragmentPagerAdapter
. J'ai annulé FragmentPagerAdapters
getItem(int position)
méthode pour créer une nouvelle fragment
fonction de la position actuelle de la ViewPager
. Maintenant je n'ai que deux Fragments
dans ma carte, mais allons ajouter plus de après avoir surmonté cet obstacle. Je suis l'aide de la newInstance()
technique pour passer le long de la Fragment
arguments, mais rien n'est jamais passé.
Code:
Mon FragmentPagerAdapter code:
//this is a variable that I pass in as the newInstanct() methods parameter,
//I update this variable from my fragments constantly
public static String fragmentArgumentsValue = "";
mViewPager.setAdapter(new FragmentPagerAdapter(fm) {
@Override
public int getCount() {
return NUMBER_OF_VIEWS;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
Log.d(TAG, "---In getPosition(), position 0---");
return Frag1
.newInstance(fragmentArgumentsValue);
case 1:
Log.d(TAG, "---In getPosition(), position 1---");
return frag2
.newInstance(fragmentArgumentsValue);
default:
Log.d(TAG, "---In getPosition(), DEFAULT---");
return frag1
.newInstance(fragmentArgumentsValue);
}
}
});
L'un des fragments de la méthode newInstance ():
public static Fragment newInstance(String fragmentArgumentsValue) {
Frag1 f = new Frag1();
Bundle bun = new Bundle();
bun.putString(KEY_FRAGMENT_ARGUMENTS_STRING, fragmentArgumentsValue);
f.setArguments(bun);
return f;
}
Obtenir les fragments arguments:
String argString = getArguments().getString(
KEY_FRAGMENT_ARGUMENTS_STRING);
if (argString.length() != 0) {
Log.d(TAG, "Trying to set the frag args to:" + argString);
mWorkingTextView.setText("" + argString);
} else {
Log.d(TAG, "Couldn't set frag args to: " + argString);
}
Ce que j'ai Essayé: j'ai essayé de donner le Activity
qui héberge le ViewPager
et FragmentPagerAdapter
un static
variable que j'ai constamment mise à jour dans chacun de mes fragments
, je comprennent le static
variable dans le fragment.newInstance(staticVariableInActivity)
méthode, mais cela ne semble pas fonctionner.
J'ai aussi essayé d'utiliser le ViewPager
rappel viewPager.setOnPageChangeListener()
j'avais remplacé la onPageSelected(int pos)
et a essayé de passer le fragment des arguments, néanmoins cela n'a pas fonctionné... donc s'il vous plaît aider moi S. O.!!!
Mes pensées: je n'ai pas les différents fragments
et layouts
dans un ArrayList
ou dans une liste pour cette question, je viens de créer une instance de la Fragments
via le newInstance()
méthode selon la position de la FragementPagerAdapter
, cela pourrait-il être un problème? Dois-je créer un singleton
liste des layouts/fragments
? Donc, je peux changer les valeurs de la Fragments
TextViews
via le singleton
liste? (excusez-moi si c'est stupide ou pas possible de chose à faire).
Note: je suis d'économie à l'écart de la TextViews valeurs via public void onSaveInstanceState(Bundle outState)
pour gérer l'écran de rotations. Cela pourrait-il être un problème?
Vous devez vous connecter pour publier un commentaire.
Bien donc j'ai ce lien vous aidera dans la communication entre les fragments: La Communication avec d'autres Fragments .
Vous devez définir une interface que l'Activité sera de mettre en œuvre et les fragments seront utiliser pour envoyer les données de continuation de l'activité, et l'activité sera alors de trouver le fragment de tag de faire quelque chose comme ceci:
et ensuite mettre à jour le fragment par l'appel d'une méthode publique mise en œuvre dans le fragment.
Le lien fourni aidera grandement, c'est à partir de l'Android de Développement de site web.
Ajoute le faisceau à l'intérieur de votre Carte.
exemple dans le constructeur de la carte :