Intereting Posts
Ошибки при создании Android-проектов в Eclipse Error: Ошибка: ресурс не найден, который соответствует указанному имени: attr 'colorAccent' Почему ViewPager и GridLayout с 30 элементами очень медленные? Отображение веб-представления «Android WebCore в этом случае не поддерживается» Предупреждение Получение файла с SD-карты с помощью Uri Как установить пользовательский образ на пространстве между двумя CirclePageIndicator в android? Студия Android, использующая> 100% процессор во все времена – фоновые процессы не работают Как преобразовать приложение java swing для работы на Android Обрабатывать событие ShareActionProvider onClick Не удалось запустить активность ComponentInfo {com.example.countryselect / com.example.countryselect.OfferSelect} Как начать работу по истечении определенного периода времени? Как изменить имя устройства в прямой прямой p2p? Объединение html front-end и python «back-end» в мобильном приложении Ресурс не найден для @ style / Widget.Holo.ActionBar.TabView Android: добавьте дату / время для выхода gradle apk filename

TabHost отображает содержимое один раз (onCreate)

У меня есть TabHost Внутри navigationDrawer и я столкнулся с этой странной проблемой, которая возникает, когда я когда-либо TabHost из TabHost которые существуют как элемент навигационного элемента в другой элемент навигационного элемента и возвращаются к TabHost он не отображает его содержимое, первый Время работает отлично, но когда я меняю элемент и возвращаюсь к нему, он не отображает содержимое; Другими словами, он не будет загружать дочерние фрагменты, если я не закрыл приложение и не перезапустил его или не изменил ориентацию (воссоздайте фрагмент).

Как это выглядит впервые, я его открываю (с контентом)

Введите описание изображения здесь

Перейдя в другой элемент NavDrawer и вернемся к TabHost

Введите описание изображения здесь

Фрагмент TabHost:

 import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TabHost; import android.widget.TabWidget; import java.util.ArrayList; import info.fds.Emirates.R; public class MyFragment extends Fragment { private TabHost mTabHost; private ViewPager mViewPager; private TabsAdapter mTabsAdapter; public MyFragment() { } @Override public void onCreate(Bundle instance) { super.onCreate(instance); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_main, container, false); mTabHost = (TabHost) v.findViewById(android.R.id.tabhost); mTabHost.setup(); mViewPager = (ViewPager) v.findViewById(R.id.pager); mTabsAdapter = new TabsAdapter(getActivity(), mTabHost, mViewPager); return v; } @Override public void onResume() { super.onResume(); // Here we load the content for each tab. mTabsAdapter.addTab(mTabHost.newTabSpec("Incident").setIndicator("Incident"), PageOneFragment.class, null); mTabsAdapter.addTab(mTabHost.newTabSpec("Service Request").setIndicator("Service Request"), PageTwoFragment.class, null); } 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; } 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); } public void onTabChanged(String tabId) { int position = mTabHost.getCurrentTab(); mViewPager.setCurrentItem(position); } public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } public void onPageSelected(int position) { // Unfortunately when TabHost changes the current tab, it kindly // also takes care of putting focus on it when not in touch mode. // The jerk. // This hack tries to prevent this from pulling focus out of our // ViewPager. TabWidget widget = mTabHost.getTabWidget(); int oldFocusability = widget.getDescendantFocusability(); widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); mTabHost.setCurrentTab(position); widget.setDescendantFocusability(oldFocusability); } public void onPageScrollStateChanged(int state) { } } } 

PageOneFragment :

 public class PageOneFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.pageone_fragment, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override public void onStart() { super.onStart(); } @Override public void onResume() { super.onResume(); } } 

PageTwoFragment

 public class PageTwoFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.pagetwo_fragment, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override public void onStart() { super.onStart(); } @Override public void onResume() { super.onResume(); } } 

Примечание. После отладки я заметил, что onCreateView() в PageOneFragment и PageTwoFragment не выполняется.

Так что происходит и почему tabHost не загружает свой контент после tabHost на другой элемент?

EDIT: после нескольких часов болезненной отладки я обнаружил, что мой код никогда не выполняет метод подбора во втором вызове, который:

 @Override public Fragment getItem(int position)//never get executed after the second call { TabInfo info = mTabs.get(position); return Fragment.instantiate(mContext, info.clss.getName(), info.args); } 

Как я могу это решить?

Любая помощь действительно оценена.

Заранее спасибо.

Эта смешная ошибка стоила мне много времени, в то время как решение было на самом деле очень простым, дело в том, что я использовал FragmentPagerAdapter вместо FragmentStatePagerAdapter после его замены, все работает отлично, надеюсь, что это поможет другим с подобной проблемой.

В вашем коде FragmentPageAdapter будет использовать FragmentPageAdapter активности, но когда instantiateItem в FragmentPageAdapter , он найдет Фрагмент в FragmentManager активности. К сожалению, PageOneFragment и PageTwoFragment находится в FragmentManager активности, поэтому нет нового создания PageOneFragment и PageTwoFragment , FragmentPageAdapter будет использовать параметр PageOneFragment в стопке фрагментов. Но PageOneFragment добавляется в последний FragmentPageAdapter , а затем нет содержимого.

Использование FragmentPageStateAdapter для замены FragmentPageAdapter – это простой выбор. Если вы хотите несколько раз использовать FragmentPageAdapter который лучше, чем FragmentPageStateAdapter , вы можете использовать его следующим образом:

  public TabsAdapter(Fragment fragment, TabHost tabHost, ViewPager pager) { super(fragment.getChildFragmentManager()); mContext = fragment.getActivity(); mTabHost = tabHost; mViewPager = pager; mTabHost.setOnTabChangedListener(this); mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); Log.i("Test", "TabsAdapter super"); } 

Используя ChildFragmentManager .

Я думаю, что если вы удалите PageOneFragment и PageTwoFragment в FragmentManager активности, это тоже нормально.