Acceder a un método de un fragmento de la actividad ViewPager

Tengo un fragmento con un método setName () que cambia un texto EditText, por medio de la función setText.

¿Cuál es la mejor manera de llamar a ese método de la actividad que hospeda ese fragmento mediante un ViewPager?

En otras palabras, ¿cómo puedo acceder a los métodos de un fragmento (que cambian el diseño de ese fragmento, por ejemplo) de la actividad que aloja ese fragmento mediante ViewPager?

Estoy pidiendo esto porque he intentado varias maneras, pero siempre con errores.

3 Solutions collect form web for “Acceder a un método de un fragmento de la actividad ViewPager”

Sé que esto es un poco tarde, pero me encontré con el mismo problema y tal vez ayudará a otros si ya lo ha resuelto.

El primer problema que encontré con ViewPager es que es casi imposible obtener una referencia a un fragmento. Los fragmentos se crean dinámicamente en getItem () y, por lo tanto, no se puede establecer un ID y se re-taged automáticamente por el swicher, por lo que no se puede encontrar por etiqueta tampoco. Hay algunas maneras de hacerlo, pero son todas soluciones. ( Actualizar datos en ListFragment como parte de ViewPager )

La manera que lo resolví estaba utilizando esencialmente un doble Callback. El Fragmento A tiene una interfaz implementada por la Actividad Principal, la Actividad Principal tiene una interfaz implementada por el Fragmento B. Por ejemplo, un botón de tintineo en el Fragmento A se llama a la función de devolución de llamada en Actividad Principal que, a su vez, llama a la devolución de llamada en el Fragmento B. Mira el código de abajo. Espero que todo lo publicado y que le ayudará. Btw, sólo he intentado esto con un ViewPager, pero supongo que funcionaría con cualquier tipo de comunicación Fragmento.

Aviv principal java:

 import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; public class MainActivity extends FragmentActivity implements FragmentA.Caller { SectionsPagerAdapter mSectionsPagerAdapter; ViewPager mViewPager; PassCallToB passOnToB = null; FragmentManager myManager = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); } public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); MyManager = fm; } @Override public Fragment getItem(int position) { Fragment fragment = null; if(position == 0) { fragment = new FragmentA(); } else if (position == 1) { fragment = new FragmentB(); passOnToB = (PassCallToB)fragment; } return fragment; } @Override public int getCount() { return 2; } @Override public CharSequence getPageTitle(int position) { switch (position) { case 0: return "Frag A"; case 1: return "Frag B"; } return null; } public void setCallback() { List<Fragment> frags = myManager.getFragments(); for(Fragment fragment : frags) { if(fragment instanceof FragmentB){ passOnToB = (PassCallToB)fragment; } } } } public interface PassCallToB { public void passItOn(); } @Override public void CallB() { if(passOnToB instanceof Fragment) passOnToB.passItOn(); else { mSectionsPagerAdapter.setCallback(); passOnToB.passItOn(); } } } 

Actividad principal xml:

 <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <android.support.v4.view.PagerTitleStrip android:id="@+id/pager_title_strip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" android:background="#33b5e5" android:paddingBottom="4dp" android:paddingTop="4dp" android:textColor="#fff" /> </android.support.v4.view.ViewPager> 

Fragmento A java:

 import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class FragmentA extends Fragment { Button btnCallB = null; Caller listener = null; public FragmentA() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle inState) { View rootView = inflater.inflate(R.layout.fragment_a, container, false); btnCallB = (Button)rootView.findViewById(R.id.btnCallB); btnCallB.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { listener.CallB(); } }); return rootView; } public interface Caller { public void CallB(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof FragmentActivity) { listener = (Caller) activity; } else { throw new ClassCastException(activity.toString() + " must implemenet listener"); } } @Override public void onDetach() { super.onDetach(); listener = null; } } 

Fragmento A xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="This is Fragment A" /> <Button android:id="@+id/btnCallB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/textView1" android:text="Call Fragment B" /> </RelativeLayout> 

Fragmento B Java:

 import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; public class FragmentB extends Fragment implements MainActivity.PassCallToB { public FragmentB() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle inState) { View rootView = inflater.inflate(R.layout.fragment_b, container, false); return rootView; } @Override public void passItOn() { Toast.makeText(getActivity(), "Hello from B", Toast.LENGTH_SHORT).show(); } } 

Fragmento B xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="This is Fragment B" /> </RelativeLayout> 

Puede acceder a los métodos públicos dentro de los fragmentos en su ViewPager . Necesita (1) almacenar una referencia al Fragment al crearlo y agregarlo a la lista que respalda su adaptador de buscapersonas o (2) necesita obtener una referencia al fragmento desde el propio adaptador de buscapersonas. Por ejemplo:

 Fragment fragmentA = null; //instance variable fragmenA = new Fragment(); //whereever you instantiate your fragment 

Si su método es

 public void setName(String args){ //do something } 

Todo lo que haría es llamar a ese método de la referencia al fragmento de su ViewPager

 fragmentA.setName(args); 

Pasas cualquier argumento que necesites como llamar a un método regular. Tenga en cuenta que esto funciona SOLAMENTE si está llamando a un método dentro de un fragmento de su conteniendo ViewPager o FragmentActivity . Si desea hacer lo contrario, fragmento de actividad, es necesario utilizar una inerface.

Fragmento

 private static FragmentName instance; public static synchronized FragmentName getInstance() { return instance; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); instance=this; .... } public void methodName() {...} 

Actividad

 FragmentName.getInstance().methodName(); 
  • NullPointerExceptions sólo en algunos dispositivos Samsung Galaxy?
  • DialogFragment: NullPointerException (biblioteca de soporte)
  • NullPointerException: name == null
  • Primeros intentos de crear el resultado del proyecto de aplicación en java.lang.NullPointerException error
  • PreferenceFragment.findPreference devuelve siempre NULL
  • ¿Por qué el servicio Android falla con NullPointerException?
  • Llamando context.getResources () devuelve null
  • Error de inicio de Android Studio v1.2.0: java.lang.NullPointerException
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.