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

Respuesta
 
Herramientas
  #1  
Viejo 14/01/16, 02:30:10
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
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");
            }
        });	
	
}
El activity_main.xml:

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;
    }
}
Codigo del Fragment

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
        }

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

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>
Hay algo que no veo o no entiendo en el proceso , a ver si me echais una mano.

Un saludo
Responder Con Cita


  #2  
Viejo 15/01/16, 21:25:30
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
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
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 20:02:06 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /