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

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
Аватара пользователя
ManHunter
Сообщения: 8
Зарегистрирован: 21 апр 2012, 19:02
Откуда: Беларусь, г.Полоцк
Контактная информация:

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

Сообщение ManHunter » 23 май 2013, 22:33

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

[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 ?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 23 май 2013, 23:36

события нельзя запретить, это как дождь или снег
можно только обработчик пустым оставить
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 24 май 2013, 00:21

Foenix писал(а):можно только обработчик пустым оставить
не всегда пустой обработчик означает что он будет действительно "пуст",
например если передать свой обработчик диалогу на либо какую кнопку и сделать его пустым, то он всё равно вызовит dismiss.
З.Ы. это как пример
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 24 май 2013, 00:53

конечно
в мире вообще очень много неочевидных вещей))
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 24 май 2013, 07:14

Код один в один из 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]

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

Аватара пользователя
ManHunter
Сообщения: 8
Зарегистрирован: 21 апр 2012, 19:02
Откуда: Беларусь, г.Полоцк
Контактная информация:

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

Сообщение ManHunter » 24 май 2013, 10:44

klblk, Спасибо тебе! Очень помог!

Ответить