Acceder

Ver la Versión Completa : ViewPager con Tabs


Walnow
22/01/15, 11:02:20
Hola a todos,

Estoy usando una activity que usar 3 fragment que están cargados en un viewpager mediante un FragmentPageAdapter.

Lo que quiero es recuperar los datos de los edittext de los 3 fragment desde la activity contenedora porque esta tiene un menú. Una opción del menú es guardar los datos en la base de datos por lo que desde la activity principal al pulsar sobre la opción de guardar quiero recuperar todo los datos que ha introducido el usuario para guardarlos en la bd.

Estoy intentando recuperar el fragment desde el adapter para después referenciar el edittext pero me da nulo

Fragment fragment1 = mAdapter.getItem(0);
EditText et1 = (EditText) fragment1.getView().findViewById(R.id.editText);

Walnow
22/01/15, 11:22:55
La solución por si a alguien mas le sirve es usar instantiateItem para obtener el fragment y de ahí su vista.


Fragment fragment1 = (Fragment) mAdapter.instantiateItem(viewPager, 0);
Fragment fragment2 = (Fragment) mAdapter.instantiateItem(viewPager, 1);

EditText et1 = (EditText) fragment1.getView().findViewById(R.id.editText);
EditText et2 = (EditText) fragment2.getView().findViewById(R.id.editText2);

Walnow
22/01/15, 15:18:29
A ver si alguien me puede ayudar porque no entiendo nada. Cuando pulso el botón nuevo si estoy en la segunda pestaña el toast me muestra bien los 3 valores de cada fragment. El problema es que si estoy en el primero o en el tercero, me entra por el try dandome un null.

Pongo el código de lo que estoy haciendo por si alguien sabe cual es el problema

Main Activity

import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

private ViewPager viewPager;
private TabAdapter tabAdapter;
private ActionBar actionBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
tabAdapter = new TabAdapter(getSupportFragmentManager());

viewPager.setAdapter(tabAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_M ODE_TABS);

actionBar.addTab(actionBar.newTab().setText("Fragment 1").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Fragment 2").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Fragment 3").setTabListener(this));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

if (id == R.id.nuevo) {

try {
Fragment1 fragment_1 = (Fragment1) tabAdapter.instantiateItem(viewPager, 0);
Fragment2 fragment_2 = (Fragment2) tabAdapter.instantiateItem(viewPager, 1);
Fragment3 fragment_3 = (Fragment3) tabAdapter.instantiateItem(viewPager, 2);

EditText et_texto1 = (EditText) fragment_1.getView().findViewById(R.id.et_texto1);
EditText et_texto2 = (EditText) fragment_2.getView().findViewById(R.id.et_texto2);
EditText et_texto3 = (EditText) fragment_3.getView().findViewById(R.id.et_texto3);

Toast.makeText(this, "Texto 1: " + et_texto1.getText().toString() + " : Texto 2: " + et_texto2.getText().toString() + " : Texto 3: " + et_texto3.getText().toString(), Toast.LENGTH_SHORT).show();

return true;
} catch (Exception e){
Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
return false;
}
}

return super.onOptionsItemSelected(item);
}

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

}
}


TabAdapter

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class TabAdapter extends FragmentPagerAdapter{

public TabAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new Fragment1();
case 1:
return new Fragment2();
case 2:
return new Fragment3();
default:
return null;
}
}

@Override
public int getCount() {
return 3;
}
}


Fragment1

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment1, container, false);
return view;
}
}


Fragment2

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment2 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment2, container, false);
return view;
}
}


Fragment3

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment3 extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment3, container, false);
return view;
}
}


Por ultimo los layout:

activity_main


<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>


fragment1

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_texto1" />
</LinearLayout>


fragment2

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_texto2" />
</LinearLayout>


fragment3

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_texto3" />
</LinearLayout>

kriogeN
22/01/15, 16:48:00
El ViewPager sólo mantiene por defecto en memoria a las páginas inmediatamente a cada lado, es decir, que si estás en la segunda tienes acceso a la primera y tercera. Pero si estás en la primera la tercera no existirá, y viceversa.

Para solucionarlo basta con establecer que quieres mantener un límite mayor, en este caso, de 2 páginas por izquierda y derecha:

http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

viewPaget.setOffscreenLimit(2);

Walnow
22/01/15, 17:46:58
Gracias kriogeN, con esto me funciona correctamente. Por último, es esa la forma correcta de usar los tab?