Я создал пользовательский вид с несколькими дочерними текстовыми представлениями и изображениями. Каждый дочерний вид имеет свой стиль. Но я изо всех сил пытаюсь установить пользовательский стиль для этих дочерних представлений программно.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone">
<LinearLayout
android:id="@+id/info_box_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/info_box_item_title_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/info_box_item_title"
style="@style/InfoBoxTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:maxWidth="150dp" />
</LinearLayout>
<TextView
android:id="@+id/info_box_item_description"
style="@style/InfoBoxDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:maxWidth="150dp"
android:visibility="gone" />
<TextView
android:id="@+id/info_box_item_extra_detail"
style="@style/InfoBoxExtraDetail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:maxWidth="150dp"
android:visibility="gone" />
</LinearLayout>
<ImageView
android:id="@+id/arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/margin_base"
android:layout_toEndOf="@id/info_box_item"
android:layout_toRightOf="@id/info_box_item"
android:src="@drawable/ic_chevron_right"
android:tint="@color/white"
android:visibility="gone" />
</RelativeLayout>
Здесь я создал три стиля InfoBoxTitle
, InfoBoxDescription
, InfoBoxExtraDetail
.
public class InfoBoxItemView extends LinearLayout {
RelativeLayout parent;
TextView title, description, moreDetail;
Context mContext;
ImageView arrow, titleIcon;
InfoBoxItemModel infoBoxItemModel;
int titleDrawableTop;
String titleText, descriptionText, moreDetailText;
public InfoBoxItemView(Context context) {
this(context, null);
}
public InfoBoxItemView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public InfoBoxItemView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
LayoutInflater.from(mContext).inflate(R.layout.info_box_item, this, true);
initAttributes(context, attrs,defStyleAttr);
init();
}
private void initAttributes(Context context, AttributeSet attrs, int defStyleAttr) {
final TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.InfoBoxItemView,
defStyleAttr,0);
titleText = typedArray.getString(R.styleable.InfoBoxItemView_title);
descriptionText = typedArray.getString(R.styleable.InfoBoxItemView_description);
titleDrawableTop = typedArray.getResourceId(R.styleable.InfoBoxItemView_titleDrawableTop, 0);
moreDetailText = typedArray.getString(R.styleable.InfoBoxItemView_moreDetail);
typedArray.recycle();
}
private void init() {
parent = findViewById(R.id.parent);
title = findViewById(R.id.info_box_item_title);
titleIcon = findViewById(R.id.info_box_item_title_icon);
description = findViewById(R.id.info_box_item_description);
moreDetail = findViewById(R.id.info_box_item_extra_detail);
arrow = findViewById(R.id.arrow);
if (!HTTextUtils.isEmpty(titleText))
setTitle(titleText);
if (!HTTextUtils.isEmpty(descriptionText))
setDescription(descriptionText);
if (!HTTextUtils.isEmpty(moreDetailText))
setMoreDetail(moreDetailText);
setTitleDrawableTop(titleDrawableTop);
}
public InfoBoxItemView setInfoBoxItemModel(InfoBoxItemModel infoBoxItemModel) {
this.infoBoxItemModel = infoBoxItemModel;
setTitle(infoBoxItemModel.getTitle());
if (!HTTextUtils.isEmpty(infoBoxItemModel.getDescription())) {
setDescription(infoBoxItemModel.getDescription());
description.setVisibility(VISIBLE);
}
if (!HTTextUtils.isEmpty(infoBoxItemModel.getMoreDetail())) {
setMoreDetail(infoBoxItemModel.getMoreDetail());
showExtraDetail(true);
}
if (!HTTextUtils.isEmpty(infoBoxItemModel.getResourceName())) {
int resource = Utils.getDrawableResource(mContext, infoBoxItemModel.getResourceName());
setTitleDrawableTop(resource);
}
parent.setVisibility(VISIBLE);
return this;
}
public void setTitleDrawableTop(@DrawableRes int resource) {
if (resource == 0) {
return;
}
titleIcon.setImageResource(resource);
}
public void showArrow() {
arrow.setVisibility(View.VISIBLE);
}
public void hideArrow() {
arrow.setVisibility(INVISIBLE);
}
public void setTitle(String title) {
this.title.setText(title);
}
public void setDescription(String description) {
this.description.setText(description);
}
public void setMoreDetail(String moreDetail) {
this.moreDetail.setText(moreDetail);
}
public void showExtraDetail(boolean show) {
if (moreDetail == null)
return;
if (show)
moreDetail.setVisibility(VISIBLE);
else
moreDetail.setVisibility(GONE);
}
public boolean isExtraDetailVisible() {
if (moreDetail != null)
return moreDetail.getVisibility() == VISIBLE;
else return false;
}
}
Теперь, если кто-то динамически создает и инициализирует InfoBoxItemView
, как он будет динамически настраивать эти три дочерних текстовых представления (заголовок, описание, moreDetail).