4

把我的头发拉在这里。因此,我正在使用具有多种类型的可绘制对象的应用程序,并且它们的结构如下:

res/
    //Portrait resources
    drawable-mdpi/
    drawable-hdpi/
    drawable-xhdpi/

    //Landscape resources
    drawable-land-mdpi/
    drawable-land-hdpi/
    drawable-land-xhdpi/

编辑我什至尝试将特定于肖像的可绘制对象放在drawable-port-mdpi等下,结果相同。

而且我有一个自定义View,用于在运行时拉入可绘制对象。这是一个精简的示例,但这是我遇到问题的地方:

public class CustomView extends FrameLayout {
    private ImageView mBackgroundView;

    public CustomView (Context context) {
        super(context);
        initialize();
    }

    public CustomView (Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize();
    }

    public CustomView (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initialize();
    }

    private void initialize () {
        mBackgroundView = new ImageView(getContext());
        mBackgroundView.setImageResource(R.drawable.my_resource);
        addView(mBackgroundView, wrapContent());
    }

    private LayoutParams wrapContent () {
        return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    }
}   

我希望当我旋转到横向时(让我先澄清一下,我没有configChanges在清单中处理这个Activity)并且View重新创建了这个,mBackgroundView应该得到可绘制的drawable-land-xhdpi. 相反,当我向后旋转时,我应该将 drawable 放入drawable-xhdpi.

现在这就是奇怪的地方。我可以确认所有可绘制对象都在那里并被检测到,就好像我在横向启动应用程序一样,我得到了正确的横向可绘制对象。然而,在旋转时,风景画仍然存在,我没有得到肖像画。相反,如果我以纵向启动,我会被纵向绘制。

当我以编程方式获取资源时,是否应该处理一些特殊情况以“重置”资源或其他东西?

4

1 回答 1

1

所以我已经弄清楚问题出在哪里,老实说,我不确定这是我的误解还是Android中的错误。我不认为将其添加为问题的一部分(回头看,我应该有),但我的可绘制对象是一个可绘制的图层列表,其中两个图像相互堆叠(一个阴影,一个阴影上方的图像):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android>
    <item>
        <bitmap android:src="@drawable/shadow"/>
    </item>

    <item>
        <bitmap android:src="@drawable/image" android:gravity="top|center_horizontal"/>
    </item>
</layer-list>

似乎这只被解析一次(我假设它被重用了效率)但它永远不会返回并使用新配置的可绘制对象重建层列表。

我改为使用两个对齐的 ImageViews 而不是一个可绘制的图层列表,一切都很好。

于 2013-04-13T04:05:41.580 回答