3

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

У меня есть фрагмент A и фрагмент B. Фрагмент A содержит другой фрагмент (ButtonFragment). В onCreate of Activity я загружаю фрагмент A, а затем переключаюсь на фрагмент B. Когда я возвращаюсь к фрагменту A (из задней части), я получаю следующую ошибку.

Исключение отправки готового сигнала.

E/MessageQueue-JNI (6330): Исключение в MessageQueue обратного вызова: handleReceiveCallback

E/MessageQueue-JNI (6330): android.view.InflateException: Binary XML файл строка # 16: Ошибка при наполнении класса фрагмент

...

Вызванные: java.lang.IllegalArgumentException: строка файл Binary XML 16: Дублирование идентификатора 0x7f080000, тег нулевого или родительский 0x0 ID с другим фрагментом для com.example.fragmentnavigation. M ainActivity $ ButtonFragment

Без подфрагмента работает навигация. Возможно, мне нужно добавить обработку ChildFragmentManager, но я не знаю, что и где. Я надеюсь, что вы можете мне помочь.

MainLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<Button 
    android:id="@+id/button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/app_name" /> 

<FrameLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    tools:context="com.example.fragmentnavigation.MainActivity" 
    tools:ignore="MergeRootFrame" /> 
</LinearLayout> 

фрагмента макета

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.fragmentnavigation.MainActivity$FragmentA" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world" /> 

    <fragment 
     android:id="@+id/button" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:name="com.example.fragmentnavigation.MainActivity$ButtonFragment"/> 

</LinearLayout> 

MainAcitivity

public class MainActivity extends FragmentActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new FragmentA()).commit(); 
    } 
} 
... 
private void switchToB() { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.container, new BFragment()); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

фрагмента А

public static class FragmentA extends Fragment { 

     public FragmentA() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, 
        false); 
      return rootView; 
     } 
    } 

ButtonFragment

public static class ButtonFragment extends Fragment { 

     public ButtonFragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.buttonfragment, container, 
        false); 
      return rootView; 
     } 
    } 

Решение Отдельное спасибо @ Арун Кумар-

действительно хороший обзор о фрагментах https://github.com/codepath/android_guides/wiki/Creating-and-Using-Fragments

Фрагмент макета

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.fragmentnavigation.MainActivity$FragmentA" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world" /> 

    <FrameLayout 
     android:id="@+id/child_fragment_container" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

OnCreate из фрагмента А

@Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, 
        false); 

      Fragment childFragment = new ButtonFragment(); 
      FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
      transaction.replace(R.id.child_fragment_container, childFragment).commit(); 

      return rootView; 
     } 

ответ

4

Вы должны добавить дочерний фрагмент во время выполнения, а не объявлять его в макете в файле макета фрагмента. У меня такая же проблема при реализации карт google.

+0

great - thank you. К сожалению, мне нужно 15 репутаций для голосования;) –

+0

спасибо. что помогло me alot – deepak825

0

Я думаю, что причина этого исключения заключается в том, что у вас есть два просмотр элементов в вашей точке зрения с [email protected]+id/button

<Button 
    android:id="@+id/button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/app_name" /> 

и

<fragment 
     android:id="@+id/button" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:name="com.example.fragmentnavigation.MainActivity$ButtonFragment"/> 

Try переименование один из них к чему-то уникальному

+0

спасибо, но реальное решение было другим –

0

Вызванный: java.lang.IllegalArgumentException: Binary линия XML файл 16: Дублированный ид 0x7f080000, тег Null, или родительский 0x0 ид с другим фрагментом для com.example.fragmentnavigation.MainActivity $ ButtonFragment

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

+0

спасибо, но реальное решение было другим –