Фрагмент сохранения состояния просмотра - PullRequest
0 голосов
/ 25 июня 2018

У меня есть фрагмент с этой структурой:

    <RelativeLayout
        android:id="@+id/control_panel"
        android:visibility="gone">

        <RelativeLayout
            android:id="@+id/control_panel_icon">

            <ImageView
                android:id="@+id/control_panel_icon_1"
                android:src="@drawable/ic_control_panel_icon_1" />

            <ImageView
                android:id="@+id/control_panel_icon_2"
                android:src="@drawable/ic_control_panel_icon_2"
                android:visibility="gone"/>
        </RelativeLayout>

        <TextView
            android:id="@+id/control_panel_tv"
            android:text="@string/not_available" />
    </RelativeLayout>

А внутри класса фрагмента у меня есть onSaveInstanceState и onActivityCreated:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("tv", panel_tv.getText().toString());
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) 
        panel_tv.setText(savedInstanceState.getString("tv"));
}

Так что это решает сохранение состоянияTextView.

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

public void setIcon(boolean condition){
    if (condition) {
         control_panel_icon_1.setVisibility(View.GONE);
         control_panel_icon_2.setVisibility(View.VISIBLE);
    } else {
         control_panel_icon_1.setVisibility(View.VISIBLE);
         control_panel_icon_2.setVisibility(View.GONE);
    }
}

Есть ли способ сохранить и восстановить, какое изображение отображается в данный момент?

Я знаю, что я не должен сохранять целые виджеты, но если я смогу сохранить состояние RelativeLayout, восстановит ли оно все дочерние состояния?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вы можете сохранить condition в outState, как показано ниже:

outState.putBoolean("condition", condition);

, а затем прочитайте его и обновите представление изображений

setIcon(savedInstanceState.getBoolean("condition"))

Или Вы можете сохранить состояние видимости изображений с помощью putInt метода:

outState.putInt("ic1", control_panel_icon_1.getVisibility());
outState.putInt("ic2", control_panel_icon_2.getVisibility());

и затем восстановить состояние:

control_panel_icon_1.setVisibility(savedInstanceState.getInt("ic1"));
control_panel_icon_2.setVisibility(savedInstanceState.getInt("ic2"));
0 голосов
/ 25 июня 2018

Внутри вашего класса Fragment объявите приватную переменную:

private boolean condition; // rename to something more descriptive

Теперь в setIcon() сохраните значение:

this.condition = condition;

Наконец сохраните это в связку в onSaveInstanceState():

outState.putBoolean("condition", this.condition);

и прочитайте его в onActivityCreated():

this.condition = savedInstanceState.getBoolean("condition");
this.setIcon(this.condition);

Примечание

Вам не нужно сохранять текст из вашего TextView. Звонок на номер super.onSaveInstanceState() уже позаботится об этом за вас.

...