蜂窝背景图画问题

时间:2012-01-04 16:08:35

标签: android relativelayout

我看到Honeycomb的绘图问题,我无法弄清楚。出于某种原因,当我在代码中向视图添加按钮时,视图的背景消失(变为黑色)。

这在运行2.3的Galaxy选项卡上运行正常。它在模拟器或运行3.2的Motorolla Xoom上失败。

详细说明:

在onCreate()中,我在main.xml中定义的relativeLayout上设置背景颜色或背景图像。我的relativeLayout被定义为fill_parent。

我的活动有一个OnTouchListener,我在其中添加两个绿色按钮(一个左对齐,一个右对齐)到relativeLayout。

当我添加这两个按钮时,relativeLayout的背景消失(显示全黑)。我无法解释原因。

线索:

  • 如果我将其中一个绿色按钮的颜色设置为Color.TRANSPARENT,则一切正常,我的背景也不会消失。这似乎是一个很大的线索,但我无法弄清楚这意味着什么。

  • 使用彩色背景时,如果我将targetSdkVersion设置为“11”而不是“7”(我的目标是2.1 / 7)它可以工作,我的颜色背景不会消失。但图像仍然破碎。

  • 使用彩色背景时,我可以调用setDrawingCacheBackgroundColor(Color.RED),这会产生红色背景而不是黑色。我可以使用它作为解决方案,将缓存颜色设置为我的背景颜色,但这在使用图像时不起作用。

这真的感觉像是android中的一个bug,因为我无法看到我在代码中做错了什么。我很感激任何帮助或建议。

这是我简单的main.xml布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/MyLayout">
</RelativeLayout>

这是我的活动代码:

public class ViewTesterActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );

        // set the relative layout as our view  
        setContentView( R.layout.main );

        // get the relative layout
        android.widget.RelativeLayout layout = (android.widget.RelativeLayout) findViewById( R.id.MyLayout );

        // set an on touch listener
        layout.setOnTouchListener( (android.view.View.OnTouchListener) mOnTouchListener );

        // set a background image 
        // PROBLEM: this background image disappears when adding the buttons in our touch handler
        // GOOFY FIX: If I change the color of one of the buttons we add to be Color.TRANSPARENT, this
        //      background image doesn't disappear.
        layout.setBackgroundResource( R.drawable.icon );
        layout.setDrawingCacheEnabled( false );

        // alternatively, set background color
        // PROBLEM: the color disappears (becomes black) when adding the button in our touch handler
        // GOOFY FIX: If I change the color of one of the buttons we add to be Color.TRANSPARENT, the color
        //              doesn't disappear
        // GOOFY FIX 2:  If I set android:targetSdkVersion to "11" in our manifest, the color doesn't disappear

        // CLUE?:  Without any fixes above and using color as the background, if I set the drawing cache color
        // to Color.RED it'll show up instead of black.  This would be a great solution to my problem but it 
        // doesn't work for background images.
        // layout.setDrawingCacheBackgroundColor( Color.RED );
        // layout.setDrawingCacheEnabled( true );
    }

    // on touch listener, add two buttons to the view
    private android.view.View.OnTouchListener mOnTouchListener = new android.view.View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if ( v != null )
                v.onTouchEvent( event );

            if ( event.getAction() == MotionEvent.ACTION_UP ) {

                android.widget.RelativeLayout layout = (android.widget.RelativeLayout) findViewById( R.id.MyLayout );

                // add a green button, left aligned
                Button btn = new Button( ViewTesterActivity.this );
                btn.setBackgroundColor( Color.GREEN );

                // GOOFY FIX: setting this instead of green solves the issue, no disappearing background
                // btn.setBackgroundColor( Color.TRANSPARENT );

                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( 100, 100 );
                params.addRule( RelativeLayout.ALIGN_PARENT_LEFT );
                layout.addView( btn, params );

                // add a green button, right aligned
                btn = new Button( ViewTesterActivity.this );
                btn.setBackgroundColor( Color.GREEN );
                params = new RelativeLayout.LayoutParams( 100, 100 );
                params.addRule( RelativeLayout.ALIGN_PARENT_RIGHT );
                layout.addView( btn, params );
            }   
            return true;
        }
    };
}

1 个答案:

答案 0 :(得分:0)

我遇到了一个类似的问题,我通过使用处理程序来实现它。您需要向活动中实施的处理程序发送消息并使视图无效。不需要setDrawingCacheEnabled( false )。以下是我为我的问题所做的事情:

protected static final int REFRESH = 0;
private Handler _hRedraw;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    _hRedraw=new Handler(){
        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what) {
            case REFRESH:
                redrawEverything();
                break;
            }
        }
    };
}
private void redrawEverything()
{
    android.widget.RelativeLayout layout = (android.widget.RelativeLayout) findViewById( R.id.MyLayout );
    layout.invalidate();
    layout.refreshDrawableState();

}

现在在OnTouchListener中,只需使用以下命令向处理程序发送消息:

_hRedraw.sendEmptyMessage(REFRESH);