RelativeLayout не рисует детей, если установлен фон

У меня класс CalloutView расширен с RelativeLayout. В настоящее время не имеет никаких методов, просто переопределяет конструкторы.

У меня также есть XML-макет для него:

<?xml version="1.0" encoding="utf-8"?>
<com.example.CalloutView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="70dp">

    <ImageButton
        android:id="@+id/imageButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="6dp"
        android:layout_marginTop="6dp"
        android:background="@drawable/button_disclose"
        android:src="@drawable/disclose" />

</com.example.CalloutView>

Я раздуваю макет экземпляра CalloutView этим кодом:

this.calloutView = (CalloutView) ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.callout_view, null);
this.calloutView.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, 105));
this.calloutView.measure(MeasureSpec.makeMeasureSpec(400, MeasureSpec.AT_MOST),  MeasureSpec.makeMeasureSpec(105, MeasureSpec.EXACTLY));

Он отлично отображает. ImageButton появляется справа от него, как и должно быть.

Но когда я добавляю фон в CalloutView:

<com.example.CalloutView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="70dp"
    android:background="@drawable/callout">
...
</com.example.CalloutView>

Он отображает только фон, но ImageButton не отображается.


Редактировать

Я использую изображение NinePatch в качестве фона. Если я заменю его на не-NinePatch, все будет работать нормально. Ошибка в Android?


Главный вопрос, почему ImageButton не рендерится, если задан фон?


person Aleksejs Mjaliks    schedule 18.11.2011    source источник


Ответы (2)


Я пробовал ваш код, но заменил ваш собственный макет на RelativeLayout:

RelativeLayout calloutView = (RelativeLayout) ((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.main, null);
        calloutView.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, 105));
        calloutView.measure(MeasureSpec.makeMeasureSpec(400, MeasureSpec.AT_MOST),  MeasureSpec.makeMeasureSpec(105, MeasureSpec.EXACTLY));

        setContentView(calloutView);

И 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="70dp"
    android:background="@drawable/ic_launcher">

    <ImageButton
        android:id="@+id/imageButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="6dp"
        android:layout_marginTop="6dp"
        android:background="#ff0000"
        android:src="@drawable/ic_launcher"
         />

</RelativeLayout>

Работает нормально:

скриншот

Следовательно, это должно быть что-то в вашем макете. Убедитесь, что в ваших переопределенных конструкторах вы сначала вызываете суперконструкторы.

person Philipp F    schedule 18.11.2011
comment
Я попытался заменить пользовательский класс на RelativeLayout. Та же проблема. - person Aleksejs Mjaliks; 18.11.2011
comment
Я обнаружил, что получаю эту проблему, если использую NinePatch в качестве фона. - person Aleksejs Mjaliks; 18.11.2011

Похоже на ошибку в Android 2.3.3. Я использую свой PNG-файл как NinePatch в качестве фона, у меня возникает эта проблема. Если я использую другой NinePatch, все работает как надо.

Я не могу воспроизвести эту проблему на Android 3.1.

person Aleksejs Mjaliks    schedule 01.12.2011