Страница 1 из 1

onStop при листании Tab

Добавлено: 23 май 2013, 22:33
ManHunter
Здравствуйте!
Я нашел реализацию табов с переключением методом скрола влево-вправо. Код:

[syntax=java]public static class TabsAdapter extends FragmentPagerAdapter
implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final TabHost mTabHost;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

static final class TabInfo {
private final String tag;
private final Class<?> clss;
private final Bundle args;

TabInfo(String _tag, Class<?> _class, Bundle _args) {
tag = _tag;
clss = _class;
args = _args;
}
}

static class DummyTabFactory implements TabHost.TabContentFactory {
private final Context mContext;

public DummyTabFactory(Context context) {
mContext = context;
}

@Override
public View createTabContent(String tag) {
View v = new View(mContext);
v.setMinimumWidth(0);
v.setMinimumHeight(0);
return v;
}
}

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, Class<?> clss, Bundle args) {
tabSpec.setContent(new DummyTabFactory(mContext));
String tag = tabSpec.getTag();

TabInfo info = new TabInfo(tag, clss, args);
mTabs.add(info);
mTabHost.addTab(tabSpec);
notifyDataSetChanged();
}

@Override
public int getCount() {
return mTabs.size();
}

@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}

@Override
public void onTabChanged(String tabId) {
int position = mTabHost.getCurrentTab();
mViewPager.setCurrentItem(position);
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}

@Override
public void onPageSelected(int position) {
TabWidget widget = mTabHost.getTabWidget();
int oldFocusability = widget.getDescendantFocusability();
widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
mTabHost.setCurrentTab(position);
widget.setDescendantFocusability(oldFocusability);
}

@Override
public void onPageScrollStateChanged(int state) {
}
}[/syntax]

Создал 3 вкладки:
[syntax=java] View view;
mTabHost = (TabHost)findViewById(android.R.id.tabhost);
mTabHost.setup();
mViewPager = (ViewPager)findViewById(R.id.pager);
mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);

//Контакты
view = createTabView(mTabHost.getContext(), R.drawable.group);
mTabsAdapter.addTab(mTabHost.newTabSpec("Contacts").setIndicator(view), Contacts.class, null);
//Сообщения
view = createTabView(mTabHost.getContext(), R.drawable.email);
mTabsAdapter.addTab(mTabHost.newTabSpec("Message").setIndicator(view), MessagesList.class, null);
//Аккаунты
view = createTabView(mTabHost.getContext(), R.drawable.settings);
mTabsAdapter.addTab(mTabHost.newTabSpec("Accounts").setIndicator(view), ManageAccounts.class, null);

}

private static View createTabView(final Context context, final int drawable)
{
View view = LayoutInflater.from(context).inflate(R.layout.tab_view, null);
ImageView iv = (ImageView) view.findViewById(R.id.imageView1);
iv.setImageResource(drawable);
return view;
}[/syntax]

с фрагментами Contacts.class, MessagesList.class, ManageAccounts.class.

Я создал методы onPause, onStart, onStop, onResume и мониторю их в логах.

В Contacts.class реализована загрузка списка друзей из вконтакте т.е. происходит обращение к api и загрузка в ListView. Проблема в том, что при переключении вкладки на MessagesList.class присходит:

Код: Выделить всё

ManageAccounts: onStart();
ManageAccounts: onResume();
А при переключении на ManageAccounts.class:

Код: Выделить всё

Contacts: onPause();
Contacts: onStop();
Ну и при обратном листании всё повторяется в обратном порядке

Код: Выделить всё

ManageAccounts: onPause();
ManageAccounts: onStop();
Contacts: onStart();
Contacts: onResume();
И программа постоянно отправляет запросы api и заново строит список, на загрузку которого требуется время и при возвращении на Contacts.class список ещё пустой.
Как запретить onStop ?

Re: onStop при листании Tab

Добавлено: 23 май 2013, 23:36
Foenix
события нельзя запретить, это как дождь или снег
можно только обработчик пустым оставить

Re: onStop при листании Tab

Добавлено: 24 май 2013, 00:21
rezak90
Foenix писал(а):можно только обработчик пустым оставить
не всегда пустой обработчик означает что он будет действительно "пуст",
например если передать свой обработчик диалогу на либо какую кнопку и сделать его пустым, то он всё равно вызовит dismiss.
З.Ы. это как пример

Re: onStop при листании Tab

Добавлено: 24 май 2013, 00:53
Foenix
конечно
в мире вообще очень много неочевидных вещей))

Re: onStop при листании Tab

Добавлено: 24 май 2013, 07:14
klblk
Код один в один из semple'ов ActionBarSherlock...)
Тут проблема в том, что PagerAdapter показывает помимо текущего фрагмента, только только соседние (по одному слева и справа).
Думаю, следует копать именно внутри FragmentPagerAdapter, смотреть где и как убиваются и воскрешаются Fragment'ы.
Могу ошибаться конечно.

Update:
"А вообще все было не так".
У ViewPager есть метод setOffscreenPageLimit,то есть нужно просто добавить строчку:
[syntax=java]mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2); //новая строчка
mTabsAdapter = new TabsAdapter(this, tabHost, mViewPager);[/syntax]

После этого будет храниться по два фрагмента с каждой стороны.

Re: onStop при листании Tab

Добавлено: 24 май 2013, 10:44
ManHunter
klblk, Спасибо тебе! Очень помог!