2013-02-26 4 views
1

Я хочу сделать что-то подобное. Картина проще, чем слова: enter image description hereФрагмент Android для планшетов и телефонов

И когда пользователь нажимает на кнопку на фрагменте B, фрагмент B изменен, но не А. я сделал два различных макета (портрет и земли один). Первые из них имеет компоновку, как

<?xml version="1.0" encoding="utf-8"?> 
<fragment 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:name="com.my.app.ContactsFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/contacts_fragment" /> 

Я кнопка в моем макете фрагмента с простой активностью вызовом:

Intent intent = new Intent(getActivity(), NextActivity.class); 
startActivity(intent); 

и земля одна таковы:

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

<fragment 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:name="com.my.app.ContactsFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/contacts_fragment" /> 

<fragment 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:name="com.my.app.HomeFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/fragment_container" /> 

</LinearLayout> 

Я изменяю внутренний фрагмент, используя следующий код:

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction(); 
NextFragment nextFrag = new NextFragment(); 
ft.replace(R.id.fragment_container, nextFrag); 
ft.addToBackStack(null); 
ft.commit(); 

Эта часть работает хорошо.

У меня есть два вопроса в настоящее время:

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

  • Если я нажимаю на элемент в фрагменте A, а затем нажимаю кнопку в фрагменте B, которая изменяет фрагмент на NextFragment. Если я нажму на другой элемент, и я сделаю то же самое. Я могу вернуться к первому пользователю. Есть ли способ сбросить стек при нажатии на новый элемент?

Благодарим за помощь.

Пс: Я использую собственный фрагмент lib, а не поддержку v4.

ответ

2

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

Однако, так как вы хотите, чтобы ваши Fragment s быть изменен на время выполнения, вы не должен поставить <fragment/> в файлах верстки. Ваша текущая архитектура делает невозможным изменение Fragment s в ваших макетах, чего вы не хотите.

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

Вы должны использовать FrameLayout контейнеры для ваших Fragment с в файлах верстки и иметь одногоActivity добавить Fragment с до тех FrameLayout контейнеров в зависимости от того, если они есть. Это позволит приложению создать 1 Fragment в портрете и 2 Fragment с в ландшафте (учитывая, что у вас есть макет для каждой ориентации).Это также позволит вам поменять местами Fragment с, пожалуйста, и добавить их в задний стек.

И пример этого Рекомендуемый Google подход можно найти here.

+0

Спасибо, я заменил макет некоторым FrameLayout. – Manitoba

+0

Лучший способ задать свой вопрос: как определить, вызван ли фрагмент в «двойном режиме» или простой? – Manitoba

+0

В зависимости от контейнеров 'FrameLayout' он попадает в макет, который он предоставляет. Если у него есть 'fragment_container_a', он добавляет к нему' FragmentA', если он получает 'fragment_container_b', он добавляет к нему' FragmentB'. Как в примере Google, 'if (findViewById (R.id.fragment_container_a)! = Null)'. Затем вы просто создаете портретный макет с помощью 'fragment_container_a' и помещаете его в папку' layout', а также ландшафтный макет с 'fragment_container_a' и' fragment_container_b' и помещаете его в папку 'layout-land'. Теперь в зависимости от макета, который получает 'Activity', он добавляет правый' Фрагмент'. –

1

Вы можете найти подходящее решение от here.

Смежные вопросы