Фрагмент внутри фрагмент - PullRequest
116 голосов
/ 13 июля 2011

Мне нужна помощь относительно работы с фрагментом внутри фрагмента, на самом деле я У меня проблема с нажатием кнопки назад. Главный экран приложения имеет кнопки и нажатие на каждую кнопку просмотра заменить на новый фрагмент (и этот фрагмент содержит внутри другой фрагмент), динамически добавление / замена фрагмента работает нормально, нажав фрагмент button1 заменен, то же самое происходит при нажатии кнопки, но если Я нажимаю кнопку еще раз, получил исключение:

"Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with
another fragment for com........ fragmentname"

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

MainActivity, где фрагменты динамически добавляются и заменен.

public class FragmentInsideFragmentTestActivity extends Activity {

    private Button button1;
    private Button button2;
    private Button button3;
    private Button button4;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        button1 =(Button) this.findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
           public void onClick(View view) {
               onButtonClick(view);
            }
        });

        button2 =(Button) this.findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                onButtonClick(view);
            }
        });

        button3 =(Button) this.findViewById(R.id.button3);
        button3.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
               onButtonClick(view);
            }
        });

        button4 =(Button) this.findViewById(R.id.button4);
        button4.setOnClickListener(new View.OnClickListener() {
           public void onClick(View view) {
               onButtonClick(view);
           }
        });
    }

    public void onButtonClick(View v) {
        Fragment fg;

        switch (v.getId()) {
           case R.id.button1:
                   fg=FirstFragment.newInstance();
                   replaceFragment(fg);
                   break;
           case R.id.button2:
                   fg=SecondFragment.newInstance();
                   replaceFragment(fg);
                   break;
           case R.id.button3:
                   fg=FirstFragment.newInstance();
                   replaceFragment(fg);
                   break;
           case R.id.button4:
                   fg=SecondFragment.newInstance();
                   replaceFragment(fg);
                   break;
        }
    }

    private void replaceFragment(Fragment newFragment) {
       FragmentTransaction trasection = getFragmentManager().beginTransaction();

        if(!newFragment.isAdded()) {
            try {
                //FragmentTransaction trasection =
                getFragmentManager().beginTransaction();
                trasection.replace(R.id.linearLayout2, newFragment);
                trasection.addToBackStack(null);
                trasection.commit();
            } catch (Exception e) {
                // TODO: handle exception
                // AppConstants.printLog(e.getMessage());
            } else {
                trasection.show(newFragment);
            }
        }
    }

Вот макет: main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button1" />

        <Button
            android:id="@+id/button2"
            android:text="Button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/button3"
            android:text="Button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/button4"
            android:text="Button4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" />
</LinearLayout>

Надеюсь, я попытался решить мою проблему.

Ответы [ 13 ]

1 голос
/ 30 сентября 2013

В данный момент вложенные фрагменты поддерживаются только в том случае, если они генерируются программно!Таким образом, в настоящее время макет вложенного фрагмента не поддерживается в схеме компоновки xml!

1 голос
/ 12 июля 2012

Нет поддержки MapFragment, команда Android говорит, что работает над этим с Android 3.0. Здесь больше информации о проблеме. Но что вы можете сделать, создав Фрагмент, который возвращает MapActivity. Здесь - пример кода. Благодаря Иназарук:

Как это работает:

  • MainFragmentActivity - это действие, которое расширяет FragmentActivity и содержит два MapFragment.
  • MyMapActivity расширяет MapActivity и имеет MapView.
  • LocalActivityManagerFragment хосты LocalActivityManager.
  • MyMapFragment расширяет LocalActivityManagerFragment и с помощью TabHost создает внутренний экземпляр MyMapActivity.

Если у вас есть какие-либо сомнения, пожалуйста, дайте мне знать

0 голосов
/ 26 ноября 2012

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

Я имею в виду:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">

     <LinearLayout android:id="@+id/linearLayout1"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="horizontal">
           <Button android:layout_width="wrap_content"
                   android:id="@+id/button1"
                   android:layout_height="wrap_content"
                   android:text="Button1"></Button>
           <Button android:text="Button2"
                   android:id="@+id/button2"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"></Button>
           <Button android:text="Button3"
                   android:id="@+id/button3"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"></Button>
           <Button android:text="Button4"
                   android:id="@+id/button4"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"></Button>
   </LinearLayout>
   <LinearLayout android:layout_width="full_screen"
              android:layout_height="0dp"
              android:layout_weight="1"
              android:id="action_For_Button1"
              android:visibility="visible">
                    <Fragment android:layout_width="full_screen"
                              android:layout_height="full_screen"
                              android:id="fragment1"
                                        .
                                        .
                                        .
             / >
     </LinearLayout>

     <LinearLayout android:layout_width="full_screen"
              android:layout_height="0dp"
              android:id="action_For_Button1"
              android:layout_weight="1"
              android:visibility="gone">
                       <Fragment android:layout_width="full_screen"
                                 android:layout_height="full_screen"
                                 android:id="fragment2"
                                           .
                                           .
                                           .
             / >
        </LinearLayout>
                     .
                     .
                     .
        </LinearLayout>

Я предполагал, что вы откроете свою страницу, когда нажмете кнопку 1. Вы можете контролировать видимость своего фрагмента при нажатии. Вы можете сделать видимым связанный Макет, а другие пропали, и с помощью Менеджера фрагментов вы можете взять свой фрагмент. Этот подход сработал для меня. И с тех пор представление, которое имеет видимость: ушел невидимым, и он не занимает места для целей макета, я думаю, что этот подход не вызывает никаких проблем с пространством.

P.S .: Я только что пытался объяснить, что мой код решения может иметь синтаксические ошибки или незавершенную структуру.

...