如何在设备旋转后保留动态创建的Drawable?

时间:2014-01-13 04:49:32

标签: android drawable android-dialogfragment

我在找出如何恢复动态创建的Drawable时遇到问题,我在方向更改后加载到DialogFragment中。当我想显示对话框时,我实例化DialogFragment并将drawable设置为:

DialogStrokeOrder dialog = DialogStrokeOrder.newInstance(gKanjiDiagram);
dialog.show(getActivity().getFragmentManager(), DIALOG_STROKE_ORDER);

gKanjiDiagram是一个Drawable我是从我从应用程序的主扩展文件中提取的SVG创建的。 DialogFragment是超级基本的,因为它需要做的只是显示Drawable:

public class DialogStrokeOrder extends DialogFragment
{
    Drawable gStrokeDiagram;

    private static final String TAG = "DialogStrokeOrder";

    public static DialogStrokeOrder newInstance(Drawable diagram)
    {
        DialogStrokeOrder dso = new DialogStrokeOrder();
        dso.setDiagram(diagram);

        return dso;
    }

    public void setDiagram(Drawable diagram)
    {
        this.gStrokeDiagram = diagram;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        builder.setTitle(R.string.kanji_stroke_order);

        LayoutInflater inflater = getActivity().getLayoutInflater();
        View layout = inflater.inflate(R.layout.dialog_strokeorder, null);

        // Display the SVG
        ImageView iv = (ImageView) layout.findViewById(R.id.stroke_order_diagram);
        iv.setImageDrawable(gStrokeDiagram);

        builder.setView(layout);
        Dialog dialog = builder.create();
        dialog.show();

        return dialog;
    }
}

我遇到的问题是,旋转后,对话框仍然可见,但图表消失了。我希望通过将Drawable添加到outState中的onSaveInstanceState() Bundle来保留Drawable,但是没有“putDrawable()”方法,所以我不知道该怎么做。

我有什么选择?

5 个答案:

答案 0 :(得分:0)

似乎最常见的方法是转换为位图并使用putParcelable()

How to Pass Drawable using Parcelable

答案 1 :(得分:0)

您可以自己管理方向更改。您可以查看有关此选项here的一些讨论。不完全是您要求的解决方案,但可能提供比传递drawable更好的替代方案。

答案 2 :(得分:0)

你可以转换为字节数组并写入Parcelable,但是大小不能太大, 这将引发异常。

答案 3 :(得分:0)

你可以将drawable堵塞到一个保留的片段中,或者只是保留你当前正在工作的片段(虽然要注意保留的片段与后面的堆栈不一致)。

答案 4 :(得分:0)

你可以转换为位图,然后只保存图像,然后在下次加载该图像。