0

Я пытаюсь создать приложение для Android, которое содержит одно действие с контейнером и ящиком навигации. В initialy пустых контейнеров загружают фрагменты, которые имеют ViewPager внутри макета вкладки, в которой я загружаю frgment с FragmentTransaction:Обращение с backstack с фрагментами, содержащими вкладки

public static void replaceFragmentInContainer(FragmentManager fragmentManager, Fragment fragmentToShow, 
     boolean addToBackStack) 
{ 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    if (addToBackStack) 
    { 
     transaction.addToBackStack(null); 
    } 
    transaction.replace(R.id.container, fragmentToShow); 
    transaction.commit(); 
} 

Я использую фрагменты v4 с v7 ActionBar в v7 ActionBarActivity.

Каждый загруженный фрагмент представляет собой фрагмент, который загружает только вкладки с другими фрагментами, которые сохраняют фактическую удобство использования. Пример такого фрагмента загрузки табуляции:

public class MainFragment extends TabsFragment 
{ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     super.onCreateView(inflater, container, savedInstanceState); 
     View contentView = inflater.inflate(R.layout.fragment_main, container, false); 
     initTabsLayout(savedInstanceState, contentView, R.id.pager); 
     addTab("tabspectag1", "", R.drawable.draw1, Fragment1.class, null); 
     addTab("tabspectag2", "", R.drawable.draw2, Fragment2.class, null); 
     addTab("tabspectag3", "", R.drawable.draw3, Fragment3.class, null); 
     return contentView; 
    } 

Проблема, с которой я столкнулся, - это задняя часть. Когда фрагмент добавляется к стопке назад, и я нажимаю кнопку «Назад», приложение возвращается к предыдущему фрагменту, как я хочу, и сам я вижу компоновку вкладок, но содержимое вкладок пуст, как будто ничего не загружено в этой вкладке. Когда это происходит, мне удается перезагрузить содержимое вкладки только при повторном выборе этого экрана с помощью навигационного ящика.

Я попытался перекрывая onBackPressed в деятельности:

@Override 
public void onBackPressed() 
{ 
    if (getFragmentManager().getBackStackEntryCount() > 0) 
    { 
     getFragmentManager().popBackStack(); 
    } else 
    { 
     super.onBackPressed(); 
    } 
} 

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

Что можно сделать для решения этой проблемы?

Поскольку я вижу таблицу вкладок исходного фрагмента в backstack, но не фрагмент внутри вкладки, возможно ли мне как-то обновить содержимое вкладки, то есть перерисовать его? Если я смогу сделать такое, то как я могу это сделать?

ответ

2

Вы не опубликовали весь код, но помните, что при использовании фрагментов внутри фрагментов внешний фрагмент должен использовать childfragmentmanager вместо обычного менеджера фрагментов.

Если у вас есть активность, то у вас есть фрагмент, в котором есть Viewpager, и внутри этого viewpager - это фрагменты, эти внешние фрагменты должны использовать свой собственный childfragmentmanager, а не actionmanager.

Деятельность использует getFragmentManager() для создания и отображения новых фрагментов. Фрагменты используют getChildFragmentManager() для создания и отображения новых внутренних фрагментов. (фрагменты внутри фрагментов).

Если вы всегда используете одного и того же обработчика фрагментов для обработки транзакций, поведение будет непредсказуемым.

Ваш Viewpager должен иметь связанный с TabSAdapter адаптер, который простирается от FragmentStatePagerAdapter, чтобы отображать новые фрагменты (и использует getChildFragmentManager из фрагмента вместо активности).

+0

Я думаю, что я, возможно, сузил проблему и начал новый вопрос об этом, если вы хотите попробовать ответить на него: http://stackoverflow.com/questions/30618497/force-viewpager-to-call-getitem- когда продолжающийся вверх-The-backstack –