3

У меня есть разные макеты для портретного и ландшафтного режима. layout\activity_main.xml:Сохранение состояния фрагмента при изменении ориентации при использовании разных макетов для разных ориентаций

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

    <FrameLayout android:id="@+id/container" 
     android:layout_height="match_parent" 
     android:layout_width="match_parent"/> 

</RelativeLayout> 

И layout-large\activity_main.xml:

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

    <fragment 
     android:id="@+id/fragment1" 
     android:name="com.example.fragmentorientationchangetest.Fragment1" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" /> 

    <fragment 
     android:id="@+id/fragment2" 
     android:name="com.example.fragmentorientationchangetest.Fragment2" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" /> 

</LinearLayout> 

Мои фрагменты одинаковы, и fragment2.xml:

<RelativeLayout 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" 
    > 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Fragment 2" /> 

    <EditText android:id="@+id/input" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="4dp" 
     android:layout_below="@+id/text"/> 
</RelativeLayout> 

То, что я хочу, когда я ввожу текст в редактировании текста в моих фрагментах и я поворачиваю экран, текст редактирования не теряет текст ввода.

Поскольку фрагменты в портретном и ландшафтном режимах не являются одним из примеров, я не могу использовать setRetaintInstance или onSaveInstanceState. Как я могу это сделать без определения двух действий и без использования onConfigurationChanged?

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

+0

«Я хочу, когда я ввожу текст в текст редактирования в своих фрагментах, и я поворачиваю экран, текст редактирования не теряет текст ввода». и «Примечание: без добавления какого-либо кода каждый фрагмент сохраняет свои данные. Поэтому, если я введу какой-то текст в фрагмент2 в портретном режиме и снова повернусь к пейзажу и снова вернусь в портретный режим, я увижу введенный текст». ** так в чем вопрос? ** и ** примечание стороны: если вы собираетесь редактировать свой вопрос, добавьте Edit или Update после того, как кто-то ответил ** – mmlooloo

+0

@mmlooloo Я в портретном режиме. Я ввожу текст в текст редактирования, а затем поворачиваю в альбомную. Я не вижу введенный текст, затем снова поворачиваю экран в портретный режим, и я вижу введенный текст. Что мне делать, чтобы увидеть введенный текст при переходе с земли на порт и обратно? –

+0

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

ответ

0

Как я код еще я иногда игнорируют простую идею, как:

SharedPreferences myText = getSharedPreferences("txt", 0); 
SharedPreferences.Editor editor = settings.edit(); 
editor.putString("userText", "Your text that you want to save"); 
editor.commit(); 

и чтение:

SharedPreferences myText = context.getSharedPreferences("txt", 0); 
String userInput = myText .getString("userText", ""); 

затем установите EditText согласно userInput.

+0

Я знаю, что это возможно, используя другие компоненты, такие как 'SharedPreferences' или' BroadCastReceiver' или статические ссылки на экземпляры фрагментов. Но я думаю, что они не хорошие идеи, потому что они не созданы для этого случая. –

+0

без 'onSaveInstanceState' и' setRetaintInstance', ваш последний выбор - это другой компонент, который вы упомянули, не подходит вообще, а также опасен как «иметь статическую ссылку на экземпляры фрагмента» – mmlooloo

+0

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

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