|
||
|
![]() |
![]() |
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
Herramientas |
#1
|
||||
|
||||
Recuperar Fragment de un FragmentPagerAdapter
Buenas,
A ver si me echais una mano porque me he quedado atrancado con esto y no hay forma de salir. Quiero pasar datos dessde MainActivity a un Fragment pulsando el botonenvio pero me da un NPE debido a que no se como retornar el fragment de un FragmentPagerAdapter Tengo dos pestañas en un viewPager y en la segunda pestaña del ViewPager tengo un mapa. El boton Envio lo tengo puesto en un appbar arriba del todo con lo cual me aparece aunque cambia a la segunda pestaña donde y al pulsarlo quiero recibir el mensaje en un metodo creado en Fragment1 recibirDato(String dato) En MainActivity:; Código:
public class MainActivity extends AppCompatActivity{ public MiFragmentPagerAdapter fragPagerAdap; ViewPager viewPager; @override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragPagerAdap = new MiFragmentPagerAdapter(getSupportFragmentManager()); viewPager = (ViewPager) findViewById(R.id.viewpager); viewPager.setAdapter(fragPagerAdap); Button botonEnvio = (Button)findViewById(R.id.botonEnvio); botonEnvio.setOnClickListener(new View.OnClickListener() { @override public void onClick(View v) { FrameLayout container = (FrameLayout)findViewById(R.id.mainFrame); Fragment1 frag1 = (Fragment1) fragPagerAdap.instantiateItem(container, 1); frag1.recibirDato("PASANDO DATO"); } }); } Código:
<LinearLayout 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" android:orientation="vertical" tools:context=".MainActivity"> <android.support.design.widget.AppBarLayout android:id="@+id/appbarlayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" > <include layout="@layout/toolbar" android:id="@+id/appbar" /> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/mainFrame" android:layout_width="wrap_content" android:layout_height="wrap_content" android:foreground="@drawable/header_shadow"> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" /> </FrameLayout> </LinearLayout> Este seria el adaptador, segun leo en stackoverflow http://stackoverflow.com/questions/1...ntpageradapter el metodo getIten no devuelve el fragment, para ello seria conveniente crear un metodo instantiateItem el cual devolveria el fragment pero no me va: Código:
public class MiFragmentPagerAdapter extends FragmentPagerAdapter { final int PAGE_COUNT = 2; private String tabTitles[] = new String[]{"Datos Generales", "Mapa General"}; public Fragment1 m1stFragment; public Fragment2 m2ndFragment; public MiFragmentPagerAdapter(FragmentManager fm) { super(fm); } @override public int getCount() { return PAGE_COUNT; } @override public Fragment getItem(int position) { Fragment f = null; switch (position) { case 0: f = Fragment2.newInstance(); break; case 1: //Fragment del mapa f = Fragment1.newInstance(); break; } return f; } @override public CharSequence getPageTitle(int position) { return tabTitles[position]; } @override public Object instantiateItem(ViewGroup container, int position) { Fragment createdFragment = (Fragment) super.instantiateItem(container, position); // save the appropriate reference depending on position switch (position) { case 0: m2ndFragment = (Fragment2) createdFragment; break; case 1: //Fragment del mapa m1stFragment = (Fragment1) createdFragment; break; } return createdFragment; } } Código:
public class Fragment1 extends Fragment { private GoogleMap mapa = null; public static Fragment1 newInstance() { Fragment1 fragment = new Fragment1(); return fragment; } public Fragment1() { // Required empty public constructor } @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View vista = inflater.inflate(R.layout.fragment_1, container, false); mapa = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap(); return vista; } public void recibirDato (String dato ){ //Almaceno dato en un arrayList por ejemplo } } Código:
fragment1.xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent"> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment"/> </RelativeLayout> Un saludo |
|
#2
|
||||
|
||||
Bueno, como veo que nadie contesta pongo aquí el link donde lo explican :
https://laaptu.wordpress.com/tag/and...y-to-fragment La idea es hacerlo a través de interfaces. Un saludo |
![]() |
![]() |
||||||
|