2015-11-06 3 views
1

J'ai un ViewPager avec des fragments dans mon activité, chaque page a une textview, je souhaite modifier le texte de la textview de la méthode onCreate dans l'activité qui contient le viewpager. Comment devrais-je faire cela?Comment changer des vues en ViewPager Fragment

ci-dessous est le code qui renvoie une exception objet null:

Fragment:

public class MyFragment extends Fragment { 

private TextView textView; 

public static MyFragment getInstance(){ 
    return new MyFragment(); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_layout, container, false); 

    textView = (TextView) rootView.findViewById(R.id.textView); 

    return rootView; 
} 

public void setText(String text){ 
    textView.setText(text); 
} 
} 

Adaptateur:

public class ViewPagerAdapter extends FragmentPagerAdapter { 

public ViewPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int position) { 
    return MyFragment.getInstance(); 
} 

@Override 
public int getCount() { 
    return 3; 
} 
} 

Activité onCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    viewPager.setAdapter(adapter); 

    MyFragment fragment = (MyFragment) adapter.getItem(0); 
    fragment.setText("Altered");  // and this returns null pointer exception 
} 

Remerciez toi!

+0

Ce fragment parce que votre toujours pas 'attached', donc' onCreateView' toujours pas appelé et votre 'TextView' est nul. Voir [fragment lifecycle] (https://dzone.com/articles/visualization-android-activity) pour plus d'informations. – NamNH

+0

Alors, comment dois-je changer le texte ou vérifier l'état de la vue par rapport à l'activité principale? (a.k.a. obtenir la vue) – TPWang

+0

S'il vous plaît essayer ce [tutoriel] (https://guides.codepath.com/android/ViewPager-with-FragmentPagerAdapter) – NamNH

Répondre

1

La plupart des FragmentPagerAdapter s auront une méthode addFragment et gardera une trace divers fragments qui sont ajoutés via un objet interne:

public class MyPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragments = new ArrayList<>(); 
    private final List<String> mFragmentTitles = new ArrayList<>(); 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragments.add(fragment); 
     mFragmentTitles.add(title); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragments.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitles.get(position); 
    } 
} 

En l'état actuel, l'implémentation de getItem retourne une nouvelle instance de MyFragment tous les l'heure s'appelle. En tant que tel, MyFragment fragment = (MyFragment) adapter.getItem(0); est une nouvelle instance qui ne sera jamais chargée dans le ViewPager, ne sera jamais gonflée, et a donc une référence textView nulle.

L'autre problème est que dans le onCreate de votre activité, les fragments n'ont pas encore été gonflés, de sorte que le textView sera nul, sauf si vous retardez l'appel:

final MyFragment fragment = (MyFragment) mPagerAdapter.getItem(0); 
Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     fragment.setText("Altered"); 
    } 
}, 100); 

Mais vraiment, pourquoi ne pas simplement mettre à la bonne valeur quand il est initialisé?

0

Essayez cette Fragment:

public class MyFragment extends Fragment { 

private TextView textView; 
private String Text; 
public MyFragment (String Text){ 
    this.Text=Text; 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_layout, container, false); 

    textView = (TextView) rootView.findViewById(R.id.textView); 
    textView.setText(Text); 
    return rootView; 
} 

} 

Adaptateur:

public class ViewPagerAdapter extends FragmentPagerAdapter { 

public ViewPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
    public Fragment getItem(int position) { 
    return new MyFragment("Altered"); 
} 

@Override 
    public int getCount() { 
    return 3; 
} 
} 

Activité onCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    viewPager.setAdapter(adapter); 
}