Не найден вид для идентификатора 0x7f0800c4 для фрагмента
Я получаю эту ошибку, когда пытаюсь заменить родительский фрагмент (SearchFragment
) из дочернего фрагмента (ClassroomsTab
) во вкладке viewPager
, По сути, я пытаюсь добиться того, чтобы у меня было меню с вкладками со множеством кнопок в каждом дочернем фрагменте, которое закрывает меню вкладок смахивания и открывает другой существующий фрагмент. SearchFragment
находится в деятельности "Навигационный ящик", как и фрагмент назначения кнопок.
Из того, что я прочитал, решение этой проблемы заключается в замене getChildFragmentManager()
в этой строке кода: viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
с getActivity().getSupportFragmentManager()
или же getFragmentManager()
, Это решает проблему сбоя приложения, но когда я щелкаю обратно на вкладке поиска через блок навигации из нового фрагмента, большинство дочерних фрагментов вкладки смахивания с кнопками не отображаются.
Спасибо за помощь:)
SearchFragment
OnCreateView
код:
public TabLayout tabLayout;
public ViewPager viewPager;
public static int int_items = 5;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//this inflates the tab layout file.
View view = inflater.inflate(R.layout.search_layout,null);
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
tabLayout = (TabLayout) view.findViewById(R.id.tabs);
viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
// this puts the titles on the top
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
}
});
//this preloads the other tabs. currently only have it set to one for testing
viewPager.setOffscreenPageLimit(1);
return view;
}
ClassroomsTab
код (пока я тестирую только с одной кнопкой):
нота: content_frame
это структура кадра навигационной деятельности
public class ClassroomsTab extends Fragment {
View myView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
myView = inflater.inflate(R.layout.classrooms, container, false);
defineButtons();
return myView;
}
public void defineButtons() {
Button CR1C1 = (Button)myView.findViewById(R.id.CR1C1);
CR1C1.setOnClickListener(buttonClickListener);
}
private View.OnClickListener buttonClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentManager fragmentmanager = getFragmentManager();
switch (view.getId()) {
case R.id.CR1C1:
fragmentmanager.beginTransaction()
.replace(R.id.content_frame
,new MapFragment())
.commit();
break;
}
}
};
Полная ошибка
09-08 15:52:13.154 12220-12220/com.example.jeremy.app E/AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной Процесс: com.example.jeremy.app, PID: 12220 java.lang.IllegalArgumentException: не найдено представление для id 0x7f0800c4 (com.example.jeremy.app:id/content_frame) для фрагмента MapFragment{c7d968F#2 id=0x7f0800c4} в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.jroid:14pp at at.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1754) в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1822) в android.support.v4.app.BackStaavaTecordord 797) по адресу android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2591) по адресу android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2378) по адресу android.suppl4.4..removeRedundantOperationsAndExecute(FragmentManager.java:2333) в android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2240) в android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:703) в android.os.Handler.handleCallback(Handler.java:790) в android.os.Handler.dispatchMessage(Handler.java:99) в android.os.Looper.loop(Looper.java:164) в android.app.ActivityThread.main(ActivityThread.java:6494) в java.lang.reflect.Method.invoke(собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
1 ответ
Обычно это происходит, когда вы меняете макеты в нескольких транзакциях. то же самое случилось со мной, и я решил это, очистив стек позади него. но вы должны использовать один FragmentManager
для всех ваших транзакций. поставить этот код после того, как вы сделали транзакцию
private void clearStack() {
if (fragmentManager.getBackStackEntryCount() > 0) {
for (int i = 0; i < fragmentManager.getBackStackEntryCount(); i++) {
fragmentManager.popBackStack();
}
}
if (fragmentManager.getFragments().size() > 0) {
for (int i = 0; i < fragmentManager.getFragments().size(); i++) {
Fragment mFragment = fragmentManager.getFragments().get(i);
if (mFragment != null) {
fragmentManager.beginTransaction().remove(mFragment).commit();
}
}
}
}