我看到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;
}
};
}
答案 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);