Сохранить / восстановить видимость для просмотра после изменения ориентации - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть RelativeLayout с несколькими вложенными LinearLayouts.По умолчанию для LinearLayouts установлено значение видимости, поэтому ни один из них не виден при первой загрузке действия.У меня есть две кнопки, которые должны показывать / скрывать LinearLayouts при нажатии.Все работает отлично, за исключением случаев, когда устройство переориентируется, а атрибуты видимости сбрасываются в значение по умолчанию «ушел» в XML.Как сохранить текущее видимое состояние вида во время изменения ориентации?

Редактировать: Окончательный код для всех, у кого есть проблема.По сути, просто добавьте видимый тег представления в SharedPreferences в пустоте, который меняет видимость, и проверьте его в OnCreate.

[Activity(Label = "My Activity", Theme="@style/TitleBar")]
public class CallManagement : Activity
{
    public LinearLayout parts; 
    public LinearLayout status; 

    ISharedPreferences p;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.CallManager);

        parts = (LinearLayout)FindViewById(Resource.Id.partLayout);
        status = (LinearLayout)FindViewById(Resource.Id.statLayout);

        p = PreferenceManager.GetDefaultSharedPreferences(this);
        var visible = p.GetString("VisibleLayout", null);

        if (visible != null && visible != "None")
        {
            RelativeLayout container = (RelativeLayout)FindViewById(Resource.Id.container);
            LinearLayout current = (LinearLayout)container.FindViewWithTag(visible);
            changeVisibility(current);
        }

        Button statusb = (Button)FindViewById(Resource.Id.changeStat);
        Button partsb = (Button)FindViewById(Resource.Id.addParts);

        statusb.Click += delegate
        {
            LinearLayout current = status;
            changeVisibility(current);
        };

        partsb.Click += delegate
        {
            LinearLayout current = parts;
            changeVisibility(current);
        };
    }

    void changeVisibility(View v)
    {           
        LinearLayout current = (LinearLayout)v;

        parts.Visibility = ViewStates.Gone;
        status.Visibility = ViewStates.Gone;

        var editor = p.Edit();

        if (v.Visibility == ViewStates.Gone)
        {
            v.Visibility = ViewStates.Visible;
            editor.PutString("VisibleLayout", v.Tag.ToString());
        }
        else
        {
            editor.PutString("VisibleLayout", "None");
        }

        editor.Commit();
    }

}

1 Ответ

1 голос
/ 16 февраля 2012

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

  1. переопределите метод onRetainNonConfigurationInstance и верните этот экземпляр.
  2. в методе onCreate, извлеките экземпляр и, если он не равен нулю, используйте его для восстановления этих значений.что-то вроде this.activityState = (UserAccountData) getLastNonConfigurationInstance();

Большинство людей не осознают, что действие воссоздается всякий раз, когда вы меняете ориентацию.Так что это позволит вам передать эти настройки новому экземпляру.

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