studio sobre programacion para herramientas desarrollo con avanzado aplicaciones android android-fragments onresume

android - sobre - Alternativa para el onResume() durante el cambio de Fragmento



manual de programacion android (6)

¡Simplemente puedes simular onResume () para cada fragmento usando una interfaz!

1- Crea una interfaz llamada FragmentLifecycle, el código es el siguiente:

public interface FragmentLifecycle { public void onResumeFragment(); }

2- Deja que cada Fragmento implemente la interfaz:

public class FragmentOne extends Fragment implements FragmentLifecycle

3- Implementar métodos de interfaz en cada fragmento:

@Override public void onResumeFragment() { Log.i(TAG, "onResumeFragment()"); Toast.makeText(getActivity(), "onResumeFragment():" + TAG,Toast.LENGTH_SHORT).show(); }

4- Métodos de interfaz de llamada en el cambio de página de ViewPager:

viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { FragmentLifecycle fragmentToShow = (FragmentLifecycle)adapter.getItem(position); fragmentToShow.onResumeFragment(); } });

¡Disfrutar!

onResume() método onResume() no se llamará cuando onResume() fragmentos más de una vez. Entonces, ¿hay alguna forma mejor de manejar la operación de reanudación?


Creo que encontré la respuesta. Aquí está el enlace que forzará onResume() del fragmento que se llamará cada vez que el fragmento se vuelva visible.
Fragmentos onResume de la pila trasera


El código sigue:

Paso 1

Crear interfaz :

public interface YourFragmentInterface { void fragmentBecameVisible(); }

Paso 2

Adjuntar Listner en setOnPageChangeListener :

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(final int position, final float v, final int i2) { } @Override public void onPageSelected(final int position) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, position); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Override public void onPageScrollStateChanged(final int position) { } });

Paso 3

Implementar interfaz en su fragmento :

public class yourActivity extends SherlockFragment implements YourFragmentInterface{ @Override public void fragmentBecameVisible() { System.out.println("TestFragment"); } }

Implementa este listador en todos los fragmento de actividad fragmentBecameVisible() esta llamada de método durante el cambio de Fragmento.

Gracias.


He resuelto este problema usando el método de anulación de fragmento:

@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { if (getView() != null) { // your code goes here } } }

Nota: En el primer fragmento de Viewpager, setUserVisibleHint llamado before onCreateView, por lo que debe manejarlo.

manejar setUserVisibleHint llamado before onCreateView en Fragment


Podría reanudar el trabajo proporcionando un método public en cada fragment cuando la página esté seleccionada, le doy un ejemplo:

public class MainActivity extends FragmentActivity { private TabHost mTabHost; private ViewPager mViewPager; private TabsAdapter mTabsAdapter; private ArrayList<Fragment> mFragments; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTabHost = (TabHost) findViewById(android.R.id.tabhost); mTabHost.setup(); mViewPager = (ViewPager) findViewById(R.id.pager); mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager); mFragments = new ArrayList<Fragment>(); mFragments.add(new TestFragment1()); mFragments.add(new TestFragment2()); mFragments.add(new TestFragment3()); mTabsAdapter.addTab(mTabHost.newTabSpec("fragment1").setIndicator("fragment1")); mTabsAdapter.addTab(mTabHost.newTabSpec("fragment2").setIndicator("fragment2")); mTabsAdapter.addTab(mTabHost.newTabSpec("fragment3").setIndicator("fragment3")); if (savedInstanceState != null) { mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("tab", mTabHost.getCurrentTabTag()); } private void refreshPage(int i) { Fragment fragment = mFragments.get(i); switch (i) { case 0: ((TestFragment1) fragment).refreshView(); break; case 1: ((TestFragment2) fragment).refreshView(); break; case 2: ((TestFragment3) fragment).refreshView(); break; } } class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener { private final Context mContext; private final TabHost mTabHost; private final ViewPager mViewPager; public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) { super(activity.getSupportFragmentManager()); mContext = activity; mTabHost = tabHost; mViewPager = pager; mTabHost.setOnTabChangedListener(this); mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); } public void addTab(TabHost.TabSpec tabSpec) { tabSpec.setContent(new DummyTabFactory(mContext)); mTabHost.addTab(tabSpec); notifyDataSetChanged(); } @Override public Fragment getItem(int i) { return mFragments.get(i); } @Override public void onPageScrolled(int i, float v, int i2) { } @Override public void onPageSelected(int i) { TabWidget widget = mTabHost.getTabWidget(); int oldFocusability = widget.getDescendantFocusability(); widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); mTabHost.setCurrentTab(i); widget.setDescendantFocusability(oldFocusability); refreshPage(i); } @Override public void onPageScrollStateChanged(int i) { } @Override public void onTabChanged(String s) { int postion = mTabHost.getCurrentTab(); mViewPager.setCurrentItem(postion, true); } @Override public int getCount() { return mFragments.size(); } class DummyTabFactory implements TabHost.TabContentFactory { private final Context mContext; public DummyTabFactory(Context context) { mContext = context; } @Override public View createTabContent(String s) { View v = new View(mContext); v.setMinimumWidth(0); v.setMinimumHeight(0); return v; } } } }

y luego escribes tu Fragment esta manera:

public class TestFragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.main, container, false); } public void refreshView() { //do whatever you want } }


Puedes probar esto,

Paso 1: anule el método Tabselected en su actividad

@Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { // When the given tab is selected, switch to the corresponding page in // the ViewPager. try { if(MyEventsFragment!=null && tab.getPosition()==3) { MyEvents.fragmentChanged(); } } catch (Exception e) { } mViewPager.setCurrentItem(tab.getPosition()); }

Paso 2: usando el método estático, haz lo que quieras en tu fragmento,

public static void fragmentChanged() { Toast.makeText(actvity, "Fragment Changed", Toast.LENGTH_SHORT).show(); }