Я создал собственный 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, становится «универсальным» набором пикселей для всех моих экземпляров элемента управления.в моей деятельности.
Как мне обеспечить, чтобы у каждого элемента управления было свое независимое сохраненное состояние?