Добавление фрагментов в макет - PullRequest
10 голосов
/ 10 февраля 2012

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

Я могу продублировать учебники, которые используютListFragment слева, и если вы щелкнете по одному из них, он обновит фрагмент «детали» справа.

Я старался изо всех сил, чтобы дублировать этот код, и просто использовать LinearLayoutс кнопками с левой стороны, чтобы при нажатии кнопки загружался соответствующий фрагмент справа, но он не работал.Когда я фиксирую FragmentTransaction, я получаю java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. Что такое родительский дочерний элемент и почему я должен вызвать на нем removeView?

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

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

Код

Основная активность

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

SelectorFragment (левая сторона)

public class SelectorFragment extends Fragment {

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

        Button button1 = (Button) fragment.findViewById(R.id.button1);

        button1.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {

                getFragmentManager().beginTransaction().replace(R.id.detail_holder, new DetailsFragment(), "stuff").commit();

            }

        });


        return fragment;
    }
}

DetailsFragment

public class DetailsFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.details, container);
    }
}

main.xml

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

    <fragment class="com.coreno.testfragment.SelectorFragment"
        android:id="@+id/select"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:layout_weight="1"
        />

    <fragment class="com.coreno.testfragment.DetailsFragment"
        android:id="@+id/detail_holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:layout_weight="2"
        />
    <!-- 
    <FrameLayout
        android:id="@+id/detail_holder" 
        android:layout_width="0px"
        android:layout_height="match_parent"
        android:layout_weight="2"
        />
 -->
</LinearLayout>

Ответы [ 2 ]

12 голосов
/ 10 февраля 2012

Когда вы надуваете XML-файл макета, не указывайте родительское представление.Звучит очень нелогично - не указывать, куда вы помещаете это раздутое представление, но это работает.

Так, например, в вашем SelectorFragment измените строку:

View fragment = inflater.inflate(R.layout.selector, container);

на

View fragment = inflater.inflate(R.layout.selector, null);

или даже лучше

View fragment = inflater.inflate(R.layout.selector, container, false);

Не забудьте сделать то же самое и в своем DetailsFragment.

8 голосов
/ 26 июля 2012

При раздувании макета внутри метода getView фрагмента необходимо использовать следующий метод раздувания: inflater.inflate (R.layout.details, container, false );

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...