Пользовательский / составной элемент управления Android: состояние Parcelable является общим, и не должно? - PullRequest
3 голосов
/ 30 ноября 2011

Я создал собственный View / Compound Control в своем приложении Android, который позволяет пользователям «рисовать» свою подпись.

Подпись содержится в Canvas, связанном с растровым объектом.

Я хочу, чтобы подпись «изображение» сохранялась при изменении ориентации.Поэтому я реализовал onSaveInstanceState / onRestoreInstanceState, сохранив пиксели растрового изображения:

@Override
public Parcelable onSaveInstanceState()
{
    // Call superclass method, retrieve Parcelable
    Parcelable superState = super.onSaveInstanceState();

    if (pictureBitmap_ != null)
    {
        // Retrieve the current pixels array.
        int totalSize = pictureBitmap_.getWidth()
                * pictureBitmap_.getHeight();

        int pixels[] = new int[totalSize];

        pictureBitmap_.getPixels(pixels,
            0,
            pictureBitmap_.getWidth(),
            0,
            0,
            pictureBitmap_.getWidth(),
            pictureBitmap_.getHeight());

        // Create the saved state object.
        SavedState savedState = new SavedState(superState);
        savedState.pixels = pixels;

        // Return the populated saved state object.
        return savedState;
    }
    else
    {
        // Simply pass original Parcelable along
        return superState;
    }
}

@Override
public void onRestoreInstanceState(Parcelable state)
{
    // Is the Parcelable an instance of our custom SavedState?
    if (!(state instanceof SavedState))
    {
        // No, simply delegate to superclass.
        super.onRestoreInstanceState(state);
        return;
    }

    // Retrieve custom state object.
    SavedState savedState = (SavedState) state;

    // Use superclass to restore original state.
    super.onRestoreInstanceState(savedState.getSuperState());

    // Restore custom state (transfer pixels).
    this.transferPixels_ = savedState.pixels;

    // If the picture bitmap is already initialized...
    if (pictureBitmap_ != null)
    {
        // Transfer the pixels right away.
        transferBitmap();

        // Refresh the canvas
        drawSignature();
    }
}

Целочисленный массив пикселей хранится в объекте SavedState, который является пользовательским подклассом BaseSavedState:

private static class SavedState
        extends BaseSavedState
{
    // Members
    int[] pixels;

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

    private SavedState(Parcel in)
    {
        super(in);
        in.readIntArray(pixels);
    }

    @Override
    public void writeToParcel(Parcel out, int flags)
    {
        super.writeToParcel(out, flags);
        out.writeIntArray(pixels);
    }

    // required field that makes Parcelables from a Parcel
    @SuppressWarnings("unused")
    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];
        }
    };
}

Теперь, когда это работает хорошо, если в моей деятельности только ОДИН (1) экземпляр моего пользовательского представления ... возникает проблема, если у меня ДВУХ (2) или более экземпляров: когда я переворачиваю ориентацию, все моиэлементы управления в конечном итоге отображают одну и ту же подпись, которая была последней подписью элемента управления.

Другими словами, последний набор пикселей, сохраненный в объекте SavedState, становится «универсальным» набором пикселей для всех моих экземпляров элемента управления.в моей деятельности.

Как мне обеспечить, чтобы у каждого элемента управления было свое независимое сохраненное состояние?

...