onResume()
метод не будет вызываться при переключении между фрагментами более одного раза. Итак, есть ли лучший способ справиться с возобновлением работы?Альтернатива для onResume() при переключении фрагментов
ответ
Думаю, я нашел ответ. Вот ссылка, которая заставит onResume()
фрагмента вызываться каждый раз, когда фрагмент становится видимым.
Fragments onResume from back stack
Вы можете сделать резюме работу обеспечить public
метод на каждом fragment
при выборе страницы, я даю вам пример:
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;
}
}
}
}
, а затем вы пишете свой Fragment
так:
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
}
}
Код:
Шаг: 1
Создать интерфейс:
public interface YourFragmentInterface {
void fragmentBecameVisible();
}
Шаг: 2
Приложить В 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) {
}
});
Шаг: 3
Реализация интерфейса в фрагменте:
public class yourActivity extends SherlockFragment implements YourFragmentInterface{
@Override
public void fragmentBecameVisible() {
System.out.println("TestFragment");
}
}
Реализовать это во всех у слушателя йор фрагмент активности fragmentBecameVisible()
этот метод вызова во время переключения фрагмента.
Спасибо.
Фактически вы можете просто позвонить YourFragmentInterface фрагмент = (YourFragmentInterface) mPagerAdapter.instantiateItem (mViewPager, position); if (fragment! = Null) { fragment.onResume(); } – Krit
Awesome, Спасибо, человек. Я искал это исправление. –
Я решил эту проблему с помощью фрагмента метода Override:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
if (getView() != null) {
// your code goes here
}
}
}
Примечание: В первом фрагменте setUserVisibleHint ViewPager Вызывается перед onCreateView так что вам нужно справиться с этим.
handle setUserVisibleHint called before onCreateView in Fragment
Вы можете попробовать это,
Шаг1: Переопределить метод Tabselected в вашей деятельности
@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());
}
Шаг 2: Используя статический метод, делать то, что вы хотите в вашем фрагменте,
public static void fragmentChanged()
{
Toast.makeText(actvity, "Fragment Changed", Toast.LENGTH_SHORT).show();
}
Вы можете просто имитировать onResume() для каждого фрагмента используя интерфейс !!!
1- создать интерфейс с именем FragmentLifecycle, код выглядит следующим образом:
public interface FragmentLifecycle {
public void onResumeFragment();
}
2- Пусть каждый фрагмент реализуют интерфейс:
public class FragmentOne extends Fragment implements FragmentLifecycle
3- реализовать методы интерфейса в каждом фрагменте:
@Override
public void onResumeFragment() {
Log.i(TAG, "onResumeFragment()");
Toast.makeText(getActivity(), "onResumeFragment():" + TAG,Toast.LENGTH_SHORT).show();
}
4 Методы вызова вызова при изменении страницы ViewPager:
viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
FragmentLifecycle fragmentToShow = (FragmentLifecycle)adapter.getItem(position);
fragmentToShow.onResumeFragment();
}
});
Наслаждайтесь!
'onResumeFragment' не должен быть общедоступным, когда он объявлен. Извините за nit-picking :) –
'adaper.getItem()' предназначен для вызова системой. Если вы вызываете 'getView()' в 'onResumeFragment', он возвращает null. Ответьте на этот вопрос: https://stackoverflow.com/a/45276364/1065835 –
- 1. java.lang.ClassCastException при переключении фрагментов
- 2. Отсутствие табло при переключении фрагментов
- 3. Сохранение состояния фрагмента при переключении фрагментов
- 4. onResume() эквивалент для фрагментов в Android
- 5. ToggleButton меняет состояние при переключении фрагментов
- 6. Промежуточные язычки отстают при переключении фрагментов
- 7. При переключении фрагментов происходит ли фрагментация наPause()?
- 8. ClassCastException при переключении фрагментов в контейнер
- 9. как сохранить текст кнопки одинаково при переключении фрагментов
- 10. Вызов OnResume когда Назад Кнопка нажата при использовании фрагментов
- 11. Альтернатива URI для фрагментов медиа в CSS?
- 12. Как сохранить состояние индикатора выполнения при переключении фрагментов?
- 13. проблема при переключении между режимами просмотра (завышение фрагментов) в FrameLayout
- 14. Невозможно очистить фокус поиска и андроида при переключении фрагментов
- 15. Короткие черные вспышки при переключении фрагментов в навигационном ящике
- 16. Как сохранить и восстановить данные пользовательских массивов при переключении фрагментов
- 17. Общие предпочтения, вызывающие исключение нулевого указателя при переключении фрагментов
- 18. Фрагмент onResume() не вызывается при использовании FragmentPagerAdapter
- 19. ViewPager вызывает onPause() onResume()
- 20. Сохранить состояние WebView при переключении Активность
- 21. Как позвонить onResume() фрагмента
- 22. ViewPager с фрагментами - onPause(), onResume()?
- 23. StringIndexOutOfBoundsException при переключении страницы
- 24. Ошибка при использовании onResume метода
- 25. onResume для аннотаций андроида
- 26. Скрыть кнопку при переключении
- 27. Предупреждение при переключении переключателя
- 28. Странное поведение при переключении
- 29. Ошибка при переключении активности
- 30. анимация: переход при переключении
Что вы подразумеваете, переключаясь между фрагментами? – Desert
Ex: Activity 'A' загружает фрагмент «X», а некоторые кнопки будут переключаться с фрагмента «X» на «Y». Затем, если вы нажмете 'onResume()' фрагмента 'X', не будет вызываться. – Manjunath