PDA

Ver la Versión Completa : Recuperar Fragment de un FragmentPagerAdapter


manolazo
14/01/16, 02:30:10
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:;


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");
}
});

}


El activity_main.xml:



<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/14035090/how-to-get-existing-fragments-when-using-fragmentpageradapter
el metodo getIten no devuelve el fragment, para ello seria conveniente crear un metodo instantiateItem el cual devolveria el fragment pero no me va:



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


Codigo del Fragment


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.ma p)).getMap();
return vista;

}

public void recibirDato (String dato ){
//Almaceno dato en un arrayList por ejemplo
}

}


A la hora de recibir desde MainActivity en el metodo recibirDato() se produce el NPE



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>



Hay algo que no veo o no entiendo en el proceso , a ver si me echais una mano.

Un saludo

manolazo
15/01/16, 21:25:30
Bueno, como veo que nadie contesta pongo aquí el link donde lo explican :
https://laaptu.wordpress.com/tag/android-passing-data-from-activity-to-fragment/
La idea es hacerlo a través de interfaces.
Un saludo