Сотовый фон рисования - PullRequest
2 голосов
/ 04 января 2012

Я вижу проблемы с рисованием в сотах, которые я не могу понять.По какой-то причине, когда я добавляю кнопки к представлению в коде, фон представления исчезает (становится черным).

Это прекрасно работает на моей вкладке Galaxy под управлением 2.3.Он не работает в эмуляторе или на моем Motorolla Xoom, работающем с 3.2.

Подробности:

В onCreate () я устанавливаю либо цвет фона, либо фоновое изображение дляlativeLayout, определенного в main.XML.Мой относительный размер определяется как fill_parent.

У меня есть OnTouchListener для моей деятельности, в котором я добавляю две зеленые кнопки (одну выровненную по левому краю, одну выровненную по правому краю), к относительной длине.

Когда ядобавьте эти две кнопки, фон относительной раскладки исчезнет (покажет все черным).Я не могу объяснить, почему.

Подсказки:

  • Если я установлю цвет одной из зеленых кнопок вместо Color.TRANSPARENT, все будет работать, и мой фонне исчезаетЭто похоже на большую подсказку, но я не могу понять, что это значит.

  • При использовании цветного фона, если я установлю targetSdkVersion на «11» вместо «7» (Я нацеливаюсь на 2.1 / 7) это работает, и мой цветной фон не исчезает.Но изображения все еще повреждены.

  • При использовании цветного фона я могу вызвать setDrawingCacheBackgroundColor (Color.RED), в результате чего красный фон вместо черного.Я мог бы использовать это в качестве решения, установив цвет кэша на свой фоновый цвет, но это не работает при использовании изображений.

Это действительно похоже на ошибку в Android, потому что я могуне вижу, что я делаю что-то не так в моем коде.Буду признателен за любую помощь или совет.

Вот мой простой макет 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 голосов
/ 30 апреля 2012

Я столкнулся с какой-то подобной проблемой, и я получил ее с помощью обработчиков.Вам необходимо отправить сообщение обработчику, внедренному в вашу деятельность, и сделать ваше представление недействительным.Нет необходимости в 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);
...