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