Home Menu

Menu



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  
Viejo 14/01/16, 02:30:10
Avatar de manolazo
manolazo manolazo no está en línea
Miembro del foro
Mensajes: 219
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Mencionado: 1 comentarios
Tagged: 0 hilos
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
Avatar de manolazo
manolazo manolazo no está en línea
Miembro del foro
Mensajes: 219
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Mencionado: 1 comentarios
Tagged: 0 hilos
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   HTCMania > Todo sobre Android > Programación y Desarrollo para Android


Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 16:38:57 (GMT +2)

Cookies
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007