Отступы, потерянные с помощью тега <merge> с пользовательским составным компонентом

Здесь настраиваемый составной компонент, который расширяет RelativeLayout и раздувает конкретный макет из xml:

public class MyCustomView extends RelativeLayout {
    public MyCustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.my_custom_view, this);
        // ...
    }
}

Макет xml использует тег <merge> (удаляет ненужный слой из иерархии представлений yada yada yada):

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <ImageView android:layout_width="wrap_content" 
               android:layout_height="wrap_content"  ... />

    <TextView  android:layout_width="wrap_content" 
               android:layout_height="wrap_content"  ... />
    ...
</merge>

... и я использую пользовательский вид в других макетах, например:

<com.example.MyCustomView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="20dip" />

Все в пользовательском представлении безукоризненно выложено, но 20dip padding, которое должно охватывать все, используется не. Кажется, что это не работает, если я помещаю его в тег <merge>. Отсутствие отступов делает его совершенно ужасным. Где я должен поместить атрибут android:padding="20dip", чтобы применить его?

Проще всего просто сделать мой MyCustomView extend FrameLayout и заменить тег <merge> на <RelativeLayout>, но он жертвует целым "сохранением иерархии представлений неглубокой", которую принимает Ромен Гай так серьезно:)

Ответы

Ответ 1

Теперь я использую обходной путь для программного программирования. И искать, вероятно, лучшее решение.

// Inflate the view from the layout resource.
LayoutInflater li = LayoutInflater.from( context );
View root = li.inflate( R.layout.article_head, this, true );
int padding = convertDip2Pixels( context, 8 );
root.setPadding( padding, padding, padding, padding );        

public static int convertDip2Pixels( Context context, int dip ) {
    return (int)TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP,
            dip, context.getResources().getDisplayMetrics() );

Ответ 2

У меня были аналогичные проблемы с заполнением, не передаваемым. Вы пробовали использовать Margin вместо?