Android Texte d'un TextView dans le Fragment qui est en FragmentPagerAdapter
C'est me rend fou. Fondamentalement, je veux créer un ViewPager
et ajouter un peu de Fragment
s à elle. Ensuite, tout ce que je veux faire, c'définissez une valeur dans l'un des Fragment
's TextView
s. Je peux ajouter les Fragment
s fine, et qu'ils attachent, mais quand je vais à findViewById()
pour l'un des TextView
s dans le premier Fragment
il jette à un NullPointerException
. J'ai, pour la vie de moi, ne peuvent pas comprendre pourquoi.
Voici mon code jusqu'à présent, laissez-moi savoir si il en faut plus s'il vous plaît.
public class SheetActivity extends FragmentActivity {
///////////////////////////////////////////////////////////////////////////
//Variable Declaration
///////////////////////////////////////////////////////////////////////////
private ViewPager viewPager;
private PagerTitleStrip titleStrip;
private String type;
private FragmentPagerAdapter fragmentPager; //UPDATE
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sheet);
viewPager = (ViewPager) findViewById(R.id.viewPager);
titleStrip = (PagerTitleStrip) findViewById(R.id.viewPagerTitleStrip);
//Determine which type of sheet to create
Intent intent = getIntent();
this.type = intent.getStringExtra("type");
FragmentManager manager = getSupportFragmentManager();
switch (type) {
case "1":
viewPager.setAdapter(new InstallAdapter(manager));
break;
case "2":
viewPager.setAdapter(new InstallAdapter(manager));
break;
}
fragmentPager = (FragmentPagerAdapter) viewPager.getAdapter(); //UPDATE
}
@Override
public void onResume() {
super.onResume();
fragmentPager.getItem(0).setText("something"); //UPDATE
}
class MyAdapter extends FragmentPagerAdapter {
private final String[] TITLES = { "Title1", "Title2" };
private final int PAGE_COUNT = TITLES.length;
private ArrayList<Fragment> FRAGMENTS = null;
public MyAdapter(FragmentManager fm) {
super(fm);
FRAGMENTS = new ArrayList<Fragment>();
FRAGMENTS.add(new FragmentA());
FRAGMENTS.add(new FragmentB());
}
@Override
public Fragment getItem(int pos) {
return FRAGMENTS.get(pos);
}
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public CharSequence getPageTitle(int pos) {
return TITLES[pos];
}
}
}
Tous Fragment
s j'ai créé seulement le onCreateView()
méthode redéfinie afin que je puisse afficher le XML de mise en page. Sauf qu'ils sont "de stock". Pourquoi je ne peux pas interagir avec les éléments dans les Fragment
s?
Mise à JOUR:
Donc faire quelque chose comme ça?
public class FragmentA extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle inState) {
return inflater.inflate(R.layout.fragment_a, container, false);
}
public void setText(String text) {
TextView t = (TextView) getView().findViewById(R.id.someTextView); //UPDATE
t.setText(text);
}
}
XML DE MISE EN PAGE DE FRAGMENT D'UN
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/someTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="22sp" />
</LinearLayout>
OriginalL'auteur Josh I | 2014-07-03
Vous devez vous connecter pour publier un commentaire.
Sauf si vous prévoyez de changer la valeur au moment de l'exécution, vous pouvez passer la valeur dans le fragment en tant que paramètre. C'est fait ma à l'aide d'un Faisceau et passant comme argument dans un Fragment, qui est ensuite extrait à partir de ses arguments. Plus d'info ici. Si vous implémentez cette, votre instanciation de nouveaux Fragments pourrait ressembler à quelque chose comme ceci:
Si, toutefois, vous êtes planification à la mise à jour de la valeur au moment de l'exécution (il va changer tant que l'utilisateur est en cours d'exécution de l'application), alors vous voulez utiliser une Interface de canal de communication entre votre fragment et de votre activité. Info ici. C'est ce à quoi il pourrait ressembler:
et il mettra à jour votre affichage de texte dans le fragment.
Alors qu'il peut être fait "plus facilement", ces méthodes sont recommandés, car ils réduisent les chances de bugs et de rendre le code beaucoup plus lisible et maintenable.
EDIT: c'est ce que votre Fragment devrait ressembler (modification du code):
Si, après que vous obtenez toujours une exception de pointeur null, votre TextView n'est PAS situé à l'endroit où il a besoin de moi, à savoir dans la R. layout.fragment_a filem, et il doit être situé là. Sauf si vous appelez la méthode de l'interface AVANT le fragment fini de charger, bien sûr.
Communicator
interface pour la rendreFragment
s parler avant, mais ils me faisaientfindViewById
pour les éléments dans leFragments
- ce ne sera pas pour une raison quelconque.Vous souhaitez créer une instance de votre affichage de texte lors de la création (dans votre onCreateView()), puis de définir dans l'interface de remplacer la méthode.
Si vous appelez getView().findViewById() DANS LE FRAGMENT, il permettra de trouver votre TextView. Si vous le faites dans VOTRE ACVIVITY, il ne le trouvera pas.
Un autre NPE lors de l'appel de
getView().findViewById()
DANS LE FRAGMENT.Mise à jour de ma réponse
OriginalL'auteur C0D3LIC1OU5
La
TextView
est situé dans les fragments de mise en page, pas dans leViewPagers
ou laPagerAdapter
, qui est à l'origine de la NPE. Maintenant, vous avez 2 options.Deuxièmement, vous pourriez faire le
TextView
dans les FragmentA statique, de sorte qu'il peut être consulté par les autres classes. Ainsi, votre code devrait ressembler à quelque chose comme ceci:Et ensuite vous pouvez modifier le texte à partir de quelque part d'autre (si c'est vraiment nécessaire):
Expliquant la méthode 2
Utiliser la ligne suivante dans votre Fragment.
Puis modifier le texte comme:
getActivity().findViewById(R.id.someTextViewInFragmentA);
et l'instanciation que comme unTextView
. Mais quand j'ai essayé de mettre le texte sur ce, j'ai reçu un autre NPE.Dans onCreateView(..) vous êtes censé utiliser la variable que vous attribuez à disposition, vous êtes le gonflage et obtenir l'ID est à partir de ce que j'ai montré ci-dessus. De toute façon, pour la deuxième méthode de travail, le fragment doit être déjà commencé ou vous allez recevoir une autre NPE.
Mise à jour de ma question ci-dessus. Quelque chose comme ça? Cela m'a donné une NPE trop.
Oh et j'ai oublié de dire, dans les fragments pour obtenir une référence à une vue, vous utilisez getView() au lieu de getActivity(). Apportez les modifications de getActivity() pour getView() et que votre problème devrait être résolu.
merci, mais pas de chance avec le commutateur.
OriginalL'auteur Aashir
Cette ligne:
est à la recherche de la vue dans votre ParentActivity. Bien sûr, il l'habitude de le trouver et c'est quand vous obtenez vos entrées en phase nationale.
Essayer quelque chose comme cela:
Ajouter un "tag" à vos fragments lorsque vous les ajoutez
Utilisation
someFragment = getSupportFragmentManager().findFragmentByTag("your_fragment_tag")
Obtenir le point de vue du fragment
fragmentView = someFragment.getView();
Et, enfin, trouver votre
TextView
et définir le texteTextView t = (TextView) fragmentView.findViewById(R.id.someTextViewInFragmentA);
t.setText("some text");
MyAdapter
, donc je ne reçois pas de les marquer.Pouvez-vous poster le code de
MyAdapter
? Je pense qu'il y a un moyen pour ajouter les balises làSon déjà là.
Aussi @Aashir a juste point de. Ne pouvez-vous pas mettre à jour le
TextView
de votreFragment
classe? N'est-ce pas plus facile?Mise à jour de ma question ci-dessus. Quelque chose comme ça? Cela m'a donné une NPE trop.
OriginalL'auteur Carlos J
Comment changer cette ligne
à
alors vous pouvez essayer de mettre à jour en "t" avec .setText("chaîne_quelconque") à l'intérieur de "SheetActivity".
OriginalL'auteur Artis JIANG