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 22/01/15, 11:02:20
Avatar de Walnow
Walnow Walnow no está en línea
Usuario novato en la web
Mensajes: 15
 
Fecha de registro: nov 2014
Mensajes: 15
Modelo de smartphone: Galaxy S4
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
ViewPager con Tabs

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
Código:
Fragment fragment1 = mAdapter.getItem(0);
EditText et1 = (EditText) fragment1.getView().findViewById(R.id.editText);

Última edición por Walnow Día 22/01/15 a las 11:10:40
Responder Con Cita


  #2  
Viejo 22/01/15, 11:22:55
Avatar de Walnow
Walnow Walnow no está en línea
Usuario novato en la web
Mensajes: 15
 
Fecha de registro: nov 2014
Mensajes: 15
Modelo de smartphone: Galaxy S4
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
La solución por si a alguien mas le sirve es usar instantiateItem para obtener el fragment y de ahí su vista.

Código:
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);
Responder Con Cita
  #3  
Viejo 22/01/15, 15:18:29
Avatar de Walnow
Walnow Walnow no está en línea
Usuario novato en la web
Mensajes: 15
 
Fecha de registro: nov 2014
Mensajes: 15
Modelo de smartphone: Galaxy S4
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
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
Código:
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_MODE_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
Código:
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
Código:
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
Código:
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
Código:
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

Código:
<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
Código:
<?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
Código:
<?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
Código:
<?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>
Responder Con Cita
  #4  
Viejo 22/01/15, 16:48:00
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
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/referen...nPageLimit(int)

viewPaget.setOffscreenLimit(2);
Responder Con Cita
  #5  
Viejo 22/01/15, 17:46:58
Avatar de Walnow
Walnow Walnow no está en línea
Usuario novato en la web
Mensajes: 15
 
Fecha de registro: nov 2014
Mensajes: 15
Modelo de smartphone: Galaxy S4
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
Gracias kriogeN, con esto me funciona correctamente. Por último, es esa la forma correcta de usar los tab?
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: 13:23:38 (GMT +1)

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