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.
- ViewPager con mutiple niños visibles y seleccionado más grande.
- ViewPager dentro de ScrollView - el desplazamiento vertical no funciona
- Cómo acceder al valor de edittext dentro de fragmento que está en un viewpager
- Android: ¿Dónde poner el código onCreate () de la actividad en un fragmento?
- Cambiar la dirección de desplazamiento de viewPager
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>
- Viewpage deja de deslizar en una dirección determinada
- Cómo configurar la altura de la barra de herramientas de Collapsing
- Puedo usar el paginador de vista con vistas (no con fragmentos)
- Iniciar animación cuando el fragmento es visible en ViewPager
- Problema de renderización de ViewPager personalizado en ciertos dispositivos:
- Custom ViewPager dentro de ObservableScrollView no se mide correctamente la altura
- ViewPager y OnItemClickListener en ListView
- ¿Es posible acceder al Fragmento actual que está siendo visualizado por un ViewPager?
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:
-
Agregue una "etiqueta" a sus fragmentos cuando los agregue
-
Utilice
someFragment = getSupportFragmentManager().findFragmentByTag("your_fragment_tag")
-
Obtener la vista del fragmento
fragmentView = someFragment.getView();
-
Y finalmente encuentre su
TextView
y configure el textoTextView 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".
- Uso de RoboFragment con FragmentManager
- ¿Cómo establecer un límite mínimo y máximo para un selector de fecha en android?