Android Definir texto de TextView en fragmento que está en FragmentPagerAdapter

Este me está volviendo loco. Básicamente, quiero crear un ViewPager y agregarle algunos Fragment . Entonces, todo lo que quiero hacer, estableció un valor en uno de los TextView s del TextView . Puedo añadir el Fragment s bien, y se adjuntan, pero cuando voy a findViewById() para uno de los TextView s en el primer Fragment que lanza una NullPointerException . Yo, por la vida de mí, no puedo entender por qué.

Aquí está mi código hasta ahora, hágamelo saber si más se necesita por favor.

 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]; } } } 

Todos los Fragment he creado solo tienen el método onCreateView() sobrescrito para que pueda mostrar el diseño XML adecuado. Aparte de eso, son "acciones". ¿Por qué no puedo interactuar con elementos de cualquiera de los Fragment ?

ACTUALIZAR:

Así que hacer algo como esto?

 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 LAYOUT PARA FRAGMENTO A

 <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> 

A menos que esté planeando cambiar el valor en tiempo de ejecución, puede pasar el valor al fragmento como un parámetro. Se hace mi uso de un paquete y pasarlo como args en un fragmento, que luego lo recupera de su args. Más información aquí . Si implementas esto, tu instanciación de nuevos Fragmentos podría ser algo como esto:

 public InstallAdapter(FragmentManager fm) { super(fm); FRAGMENTS = new ArrayList<Fragment>(); FRAGMENTS.add(FragmentA.newInstance("<text to set to the TextView>")); FRAGMENTS.add(FragmentB.newInstance("<text to set to the TextView>")); } 

Si, sin embargo, está planeando actualizar el valor en tiempo de ejecución (cambiará a medida que el usuario esté ejecutando la aplicación), entonces desea utilizar una Interfaz para canalizar la comunicación entre su fragmento y su actividad. Información aquí . Esto es lo que podría parecer:

 //Declare your values for activity; ISetTextInFragment setText; ISetTextInFragment setText2; ... //Add interface public interface ISetTextInFragment{ public abstract void showText(String testToShow); } ... //your new InstallAdapter public InstallAdapter(FragmentManager fm) { super(fm); FRAGMENTS = new ArrayList<Fragment>(); Fragment fragA = new FragmentA(); setText= (ISetTextInFragment)fragA; FRAGMENTS.add(fragA); Fragment fragB = new FragmentB(); setText2= (ISetTextInFragment)fragB; FRAGMENTS.add(fragB); } //then, you can do this from your activity: ... setText.showText("text to show"); ... 

Y actualizará su vista de texto en el fragmento.

Si bien se puede hacer "más fácilmente", estos métodos son recomendados porque reducen las posibilidades de errores y hacer que el código mucho más legible y mantenible.

EDIT: esto es lo que su fragmento debe ser similar (modificó su código):

 public class FragmentA extends Fragment implements ISetTextInFragment { TextView myTextView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle inState) { View v = inflater.inflate(R.layout.fragment_a, container, false); myTextView = (TextView)v.findViewbyId(R.id.someTextView) return v; } @Override public void showText(String text) { myTextView.setText(text); } } 

Si después de eso sigue recibiendo una excepción de puntero nulo, su TextView NO se encuentra donde me necesita, concretamente en el archivo R.layout.fragment_a, y debe estar ubicado allí. A menos que esté llamando al método de interfaz ANTES de que el fragmento haya terminado de cargar, por supuesto.

El TextView se encuentra en el diseño de fragmentos, no en el ViewPagers o el PagerAdapter , que está causando el NPE. Ahora, tienes 2 opciones.

  • El primero es el más fácil, usted debe simple mover su código para cambiar el texto en la clase del fragmento correspondiente, FragmentA en este caso.
  • En segundo lugar, usted podría hacer el TextView en FragmentA estático, por lo que puede ser accedido por otras clases. Así que su código sería algo como esto:

      .... TextView myText; @Override public View onCreateView(....) { myLayout = ....; myText = myLayout.findViewById(yourID); .... } 

Y luego cambiarías el texto de otro lugar (si es realmente necesario):

  FragmentA.myText.setText("new text"); 

Explicación del método 2

Utilice lo siguiente en su Fragmento.

 public static void setText(String text) { TextView t = (TextView) getView().findViewById(R.id.someTextView); t.setText(text); } 

A continuación, cambie el texto como:

 FragmentA.setText("Lulz"); 

Esta línea:

 TextView t = (TextView) findViewById(R.id.someTextViewInFragmentA); 

Está buscando la vista en su ParentActivity. Por supuesto que no lo encontrará y que es cuando obtiene su NPE.

Intente algo como esto:

  1. Agregue una "etiqueta" a sus fragmentos cuando los agregue

  2. Utilice someFragment = getSupportFragmentManager().findFragmentByTag("your_fragment_tag")

  3. Obtener la vista del fragmento fragmentView = someFragment.getView();

  4. Y finalmente encuentre su TextView y configure el texto

    TextView t = (TextView) fragmentView.findViewById(R.id.someTextViewInFragmentA); t.setText("some text");

¿Cómo cambiar esta línea

 TextView t = (TextView) getView().findViewById(R.id.someTextView); //UPDATE 

a

 TextView t = (TextView) getActivity().findViewById(R.id.someTextView); //UPDATE 

Entonces puede intentar actualizar "t" con .setText ("some_string") dentro de "SheetActivity".

  • Igualar padre para viewpager dentro de scrollview no funciona
  • Enviar valores de la actividad ViewPager a un fragmento por paquete
  • Los fragmentos ViewPager hacen referencia al mismo RecyclerView y / o Adapter
  • Cambiar ViewPager para habilitar el desplazamiento de páginas infinito
  • Texto en PagerTabStrip no se muestra en la primera vista
  • Vea la traducción al deslizar un ViewPager
  • FragmentPagerAdapter actualización de título dinámicamente
  • No se muestran los elementos de acción del fragmento inicial de Viewpager
  • IllegalArgumentException: el radio debe ser> 0
  • Trabajar con ViewPager y Fragmentos
  • Margen de ViewPager en transformaciones de PageTransformer
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.