Состояние пользовательского представления сохраняется, но никогда не восстанавливается

1

Я использовал советы из " Как предотвратить пользовательские представления от потери состояния при изменении ориентации экрана", но даже когда мой View сохраняет его правильно, onRestoreInstanceState никогда не вызывается. Метод восстановления активности призван сделать вещи более странными.

import java.text.DecimalFormat;
import java.text.NumberFormat;
import com.szyk.myheart.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Scroller;

public class NumberScroller extends View implements OnTouchListener{

    private final float VIEW_FILL_PERCENTAGE = 80;
    private final int MIN_VELOCITY_Y = 100;
    private final int VELOCITY_UNIT = 1000;
    private final String TAG = "NumberScroller";
    private final int ALIGNING_DURATION = 1000;

    private boolean isCustomizing = true;
    private boolean isDragged = false;
    private boolean isNewVelocityTracker = false;

    private Scroller scroller;
    private VelocityTracker velocityTracker;
    private float lastY;
    private int absoleteY;
    private float velocityY;
    private float ascent;
    private Integer maxScrollerNumber;
    private Integer minScrollerNumber;

    private Paint paintNumber;
    private Paint paintNumberActivated;
    private Paint paintBorder;
    private float textOffsetX;
    private Drawable foregroundBorder;
    private Drawable foregroundAlpha;
    private NumberFormat numberFormatter;


    /**
     * Initializes attributes and variables.
     * @param attrs - AttributeSet for Number Scroller
     * @param context in which scroller exists.
     */
    public NumberScroller(Context context, AttributeSet attrs) {
        super(context, attrs);
        Log.i(TAG, "Creating NumberScroller.");
        initAttrs(attrs, context);
        scroller = new Scroller(getContext());
        setOnTouchListener(this);

        foregroundAlpha = getResources().getDrawable(R.drawable.foreground_alpha);

        numberFormatter = new DecimalFormat();
        numberFormatter.setMinimumIntegerDigits(maxScrollerNumber.toString()
                .length());
        numberFormatter.setMinimumFractionDigits(0);

        setSaveEnabled(true);

    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
    }
    /**
     * (non-Javadoc)
     * @see android.view.View#onMeasure(int, int)
     */

/**
     * Initializes attributes from xml description.
     * @param attrs - AttributeSet for Number Scroller
     * @param context in which scroller exists.
     */
    private void initAttrs(AttributeSet attrs, Context context) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs,
                R.styleable.NumberScroller);
        maxScrollerNumber = typedArray.getInteger(
                R.styleable.NumberScroller_maximum, 99);
        minScrollerNumber = typedArray.getInteger(
                R.styleable.NumberScroller_minimum, 0);
        if (maxScrollerNumber < minScrollerNumber) {
            int tmp = minScrollerNumber;
            minScrollerNumber = maxScrollerNumber;
            maxScrollerNumber = tmp;
        }
        typedArray.recycle();
    }

V1:

@Override
  public Parcelable onSaveInstanceState() {
    Log.i(TAG,"SAve");
    //begin boilerplate code that allows parent classes to save state
    Parcelable superState = super.onSaveInstanceState();

    SavedState ss = new SavedState(superState);
    //end

    ss.stateToSave = absoleteY;

    return ss;
  }

  @Override
  public void onRestoreInstanceState(Parcelable state) {
      Log.i(TAG,"REstore");
    //begin boilerplate code so parent classes can restore state
    if(!(state instanceof SavedState)) {
      super.onRestoreInstanceState(state);
      return;
    }
    SavedState ss = (SavedState)state;
    super.onRestoreInstanceState(ss.getSuperState());
    //end

    absoleteY = ss.stateToSave;
  }

  public static class SavedState extends BaseSavedState {
   int stateToSave;

    SavedState(Parcelable superState) {
      super(superState);
    }

    private SavedState(Parcel in) {
      super(in);
      this.stateToSave = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
      super.writeToParcel(out, flags);
      out.writeInt(this.stateToSave);
    }
    //required field that makes Parcelables from a Parcel
    public static final Parcelable.Creator<SavedState> CREATOR =
        new Parcelable.Creator<SavedState>() {
          public SavedState createFromParcel(Parcel in) {
            return new SavedState(in);
          }
          public SavedState[] newArray(int size) {
            return new SavedState[size];
          }
    };
  }

V2:

@Override
protected Parcelable onSaveInstanceState() {
    Log.i(TAG, "Saving state.");
    Bundle bundle = new Bundle();
    bundle.putParcelable("state", super.onSaveInstanceState());
    bundle.putInt("absoleteY", absoleteY);
    return bundle;
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
    Log.i(TAG, "Restoring state");

    if(state instanceof Bundle){

        Bundle bundle = (Bundle) state;
        absoleteY = bundle.getInt("absoleteY");
        super.onRestoreInstanceState(bundle.getParcelable("state"));
        return;
    }

    super.onRestoreInstanceState(state); 
}

В журналах я никогда не вижу "Восстановить состояние".

Похоже, что если я не использую свой пользовательский вид внутри android.support.v4.view.ViewPager, вызывается onRestoreInstanceState. Кто-нибудь знает причину этого, и мне нужно вызвать сохранение/восстановление изнутри действия?

  • 0
    Пожалуйста, отправьте код.
  • 0
    onRestoreInstanceState не вызывается вообще или ваш View «s предыдущее состояние не восстанавливается? Кроме того, как уже прокомментировал визирь, вы должны добавить код для пользовательского представления.
Теги:
android-layout
android-view
custom-controls
android-widget

1 ответ

0

Этот вопрос очень старый, но я наткнулся на него, в то время как Googling решение, после того, как я понял это.

Проблема может заключаться в том, что пользовательские представления создаются программно внутри корневого метода Activity onCreate.

Решение состоит в том, чтобы вызвать onSaveInstanceState и onRestoreInstanceState из корневой активности, содержащей ViewPager, и сохранить также пользовательское состояние просмотра.

Внутри вашего корня выполните следующие действия:

Сохранение состояния вашего пользовательского представления

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putParcelable("STATE_COLLECTION", collectionFrameLayout.onSaveInstanceState());
    super.onSaveInstanceState(outState);
}

И внутри onCreate() восстановить его после создания пользовательских представлений.

 if (savedInstanceState != null) {
     Parcelable state = savedInstanceState.getParcelable("STATE_COLLECTION");
     if (state != null) {
         collectionFrameLayout.onRestoreInstanceState(state);
     }
 }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню