it-roy-ru.com

Альтернатива для onResume () во время переключения фрагментов

Метод onResume() не будет вызван, когда мы переключаемся между фрагментами более одного раза. Итак, есть ли лучший способ обработать резюме?

28
Manjunath

Я думаю, я нашел ответ. Вот ссылка, которая заставляет onResume() фрагмента вызываться каждый раз, когда фрагмент становится видимым.
Фрагменты onResume из заднего стека

3
Manjunath

Код следует:

Шаг 1

Создать интерфейс :

public interface YourFragmentInterface {
    void fragmentBecameVisible();
}

Шаг 2

Прикрепить Listner в 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");
    }
}

Реализуйте этот listner во всех ваших действиях фрагмента fragmentBecameVisible() этого вызова метода во время переключения фрагмента.

Благодарю.

40
Dhaval

Вы можете просто моделировать 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();
        }
    });

Наслаждайтесь!

2
farhad.kargaran

Вы можете возобновить работу, предоставив метод 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
}
}
2
Jishi Chen

Вы можете попробовать это,

Шаг 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();
}
1
Manoj Kumar

Я решил эту проблему с помощью метода переопределения фрагмента:

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

Примечание: В первом фрагменте Viewpager setUserVisibleHint вызывается перед onCreateView, поэтому вам нужно это обработать.

обрабатывать setUserVisibleHint, вызываемый перед onCreateView во Fragment

0
Dhaval Jivani