|
||
|
|
|
|||||||
| 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 |
![]() |
Estás aquí
|
||||||
|
||||||