java android android-fragments fragmentpageradapter

java - ¿Cómo uso FragmentPagerAdapter para tener pestañas con contenido diferente?



android android-fragments (3)

Crea el adaptador:

class MyPagerAdapter extends FragmentPagerAdapter { public List<String> fragmentsA; public MyPagerAdapter(FragmentManager fm) { super(fm); fragmentsA = fragments; } @Override public Fragment getItem(int position) { //return MyFragment.newInstance(); return Fragment.instantiate(context, fragmentsA.get(position)); } @Override public CharSequence getPageTitle(int position) { //return CONTENT[position % CONTENT.length].toUpperCase(); return mEntries.get(position % CONTENT.length).toUpperCase(); } @Override public int getCount() { // return CONTENT.length; return mEntries.size(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } }

Cada fragmento pertenece a diferentes clases.

Así que tienes que definir una lista de fragmentos (estos van a la FragmentActivity principal):

static MyPagerAdapter adapter;

y rellenarlo con los fragmentos:

fragments.add(ConnectionFragment.class.getName()); fragments.add(DataFragment.class.getName()); fragments.add(Tab3.class.getName()); //..etc

Luego tienes que agregar los fragmentos al adaptador de esta manera:

pager = (ViewPager)findViewById(R.id.viewpager); adapter = new MyPagerAdapter(getSupportFragmentManager()); pager.setAdapter(adapter);

El MyPagerAdaper revisará todos los fragmentos contenidos en la lista de fragments y luego creará una instancia de cada uno de ellos.

Quiero tener diferentes pestañas, donde puedes deslizarte como en el mercado de Android. Cada pestaña debe usar un fragmento y usar un método para ello.

Esta es mi clase FragmentPagerAdapter:

public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Fragment fragment =null; switch (position) { case 0: fragment = new ConnectionFragment(); break; case 1: fragment = new DataFragment(); break; case 2: fragment = new GraphFragment(); break; } return fragment; } @Override public int getCount() { // Show 3 total pages. return 3; } }

Y tengo tres clases para cada tipo de fragmento / pestaña:

public static class ConnectionFragment extends Fragment { public static final String ARG_SECTION_NUMBER = "section_number"; public String stringConnectionStatus = "Offline"; public String stringWiflyIp = "0.0.0.0"; public ConnectionFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View connectionView = inflater.inflate(R.layout.fragment_connection, container, false); TextView statusView = (TextView) connectionView.findViewById(R.id.status_label); statusView.setText("Connection status: " + stringConnectionStatus); TextView ipView = (TextView) connectionView.findViewById(R.id.ip_label); ipView.setText("WiFly IP: " + stringWiflyIp); /**TextView sectionBarView = (TextView) connectionView .findViewById(R.id.section_label); sectionBarView.setText("pups");"*/ return connectionView; } } public static class DataFragment extends Fragment { public DataFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View dataView = inflater.inflate(R.layout.fragment_data, container, false); TextView sectionBarView = (TextView) dataView .findViewById(R.id.section_label); sectionBarView.setText("pups2"); return dataView; } } public static class GraphFragment extends Fragment { public GraphFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_graph, container, false); TextView sectionBarView = (TextView) rootView .findViewById(R.id.section_label); sectionBarView.setText("pups3"); return rootView; } }

Cada fragmento debe ser personalizable, por eso tengo tres clases.

Sin embargo, la aplicación se bloquea en el método getItem. ¿Algunas ideas? ¡Gracias!

Editar: El MainActivity.java completo:

import ... public class MainActivity extends FragmentActivity { /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which * will keep every loaded fragment in memory. If this becomes too memory * intensive, it may be best to switch to a * {@link android.support.v4.app.FragmentStatePagerAdapter}. */ SectionsPagerAdapter mSectionsPagerAdapter; public List<String> fragments = new Vector<String>(); /** * The {@link ViewPager} that will host the section contents. */ ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Create the adapter that will return a fragment for each of the three // primary sections of the app. mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); //pager mViewPager.setAdapter(mSectionsPagerAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. */ public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); fragments.add(ConnectionFragment.class.getName()); fragments.add(DataFragment.class.getName()); fragments.add(GraphFragment.class.getName()); //fragmentsA = "fragments"; } @Override public Fragment getItem(int position) { // getItem is called to instantiate the fragment for the given page. // Return a DummySectionFragment (defined as a static inner class // below) with the page number as its lone argument. /*Fragment fragment =null; switch (position) { case 0: fragment = new ConnectionFragment(); break; case 1: fragment = new DataFragment(); break; case 2: fragment = new GraphFragment(); break; } return fragment;*/ return Fragment.instantiate(getBaseContext(), fragments.get(position)); } @Override public int getCount() { // Show 3 total pages. return 3; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { case 0: return getString(R.string.title_section1).toUpperCase(l); case 1: return getString(R.string.title_section2).toUpperCase(l); case 2: return getString(R.string.title_section3).toUpperCase(l); } return null; } } /** * A dummy fragment representing a section of the app, but that simply * displays dummy text. */ public static class ConnectionFragment extends Fragment { /** * The fragment argument representing the section number for this * fragment. */ public static final String ARG_SECTION_NUMBER = "section_number"; public String stringConnectionStatus = "Offline"; public String stringWiflyIp = "0.0.0.0"; public ConnectionFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View connectionView = inflater.inflate(R.layout.fragment_connection,container, false); TextView statusView = (TextView) connectionView.findViewById(R.id.status_label); statusView.setText("Connection status: " + stringConnectionStatus); TextView ipView = (TextView) connectionView.findViewById(R.id.ip_label); ipView.setText("WiFly IP: " + stringWiflyIp); /**TextView sectionBarView = (TextView) connectionView .findViewById(R.id.section_label); sectionBarView.setText("pups");"*/ return connectionView; } } public static class DataFragment extends Fragment { public DataFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View dataView = inflater.inflate(R.layout.fragment_data, container, false); //TextView sectionBarView = (TextView) dataView.findViewById(R.id.section_label); //sectionBarView.setText("pups2"); return dataView; } } public static class GraphFragment extends Fragment { public GraphFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_graph, container, false); //TextView sectionBarView = (TextView) rootView.findViewById(R.id.section_label); //sectionBarView.setText("pups3"); return rootView; } } }


En su método GetItem FragmentPagerAdapter #, no cree el objeto de los Fragmentos. Debes devolver el Fragmento de la siguiente manera:

return Fragment.instantiate(context, ConnectionFragment.class.getName());

Esto significa que el método se verá así:

public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Fragment fragment =null; switch (position) { case 0: fragment = Fragment.instantiate(context, ConnectionFragment.class.getName()); break; case 1: fragment = Fragment.instantiate(context, DataFragment.class.getName()); break; case 2: fragment = Fragment.instantiate(context, GraphFragment.class.getName()); break; } return fragment; } @Override public int getCount() { // Show 3 total pages. return 3; } }


Vea este ejemplo:

public static class MyPagerAdapter extends FragmentPagerAdapter { private static int NUM_ITEMS = 3; public MyPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); } // Returns total number of pages @Override public int getCount() { return NUM_ITEMS; } // Returns the fragment to display for that page @Override public Fragment getItem(int position) { switch (position) { case 0: // Fragment # 0 - This will show FirstFragment return FirstFragment.newInstance(0, "Page # 1"); case 1: // Fragment # 0 - This will show FirstFragment different title return FirstFragment.newInstance(1, "Page # 2"); case 2: // Fragment # 1 - This will show SecondFragment return SecondFragment.newInstance(2, "Page # 3"); default: return null; } } // Returns the page title for the top indicator @Override public CharSequence getPageTitle(int position) { return "Page " + position; } }