Отступы, потерянные с помощью тега <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 вместо?