我在Android应用中使用Tabhost进行导航。一切正常,但是我的一个标签是用于消息,如果用户至少有一条消息,我想在显示用户拥有的消息数量的标签图标中添加一个文本视图。所以基本上我有下面的图标和文本消息,并希望在选项卡图标的右上角有一个显示消息计数的附加文本视图。
我发现了与向标签添加文字相关的帖子,但它只是修改了现有的标签指示文字视图。是否可以在选项卡上添加一个我可以引用的文本视图,并设置为可见性正常,如果存在消息,则将可见性更新为可见并显示计数?
我猜我需要为此标签创建自定义XML布局,并在调用时使用它
.setIndicator("Messages",res.getDrawable(R.drawable.tab_messages))
非常感谢任何见解或示例,谢谢!!
答案 0 :(得分:2)
要实现这一目标,您需要实现一个自定义TabHost
来覆盖Android框架中的自定义{。}}。
public class CustomTabHost extends TabHost {
public CustomTabHost(Context context) {
super(context);
}
public CustomTabHost(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
Androids TabHost有一个名为TabSpec
的内部类,它实现了以下方法:
public TabSpec setIndicator(CharSequence label, Drawable icon) {
mIndicatorStrategy = new LabelAndIconIndicatorStrategy(label, icon);
return this;
}
所以为了向Tab添加另一个TextView ,您需要像这样重载此方法:
public TabSpec setIndicator(CharSequence label, Drawable icon, CharSequence text) {
mIndicatorStrategy = new LabelIconTextIndicatorStrategy(label, icon, text);
return this;
}
要完成这项工作,您还需要实施与LabelIconTextIndicatorStrategy
类似的LabelAndIconIndicatorStrategy
,但要包含文字。
private class LabelIconTextIndicatorStrategy implements IndicatorStrategy {
private final CharSequence mLabel;
private final Drawable mIcon;
private final CharSequence mText;
private LabelIconTextIndicatorStrategy(CharSequence label, Drawable icon, CharSequence text) {
mLabel = label;
mIcon = icon;
mText = text;
}
public View createIndicatorView() {
final Context context = getContext();
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View tabIndicator = inflater.inflate(mTabLayoutId,
mTabWidget, // tab widget is the parent
false); // no inflate params
final TextView tv = (TextView) tabIndicator.findViewById(R.id.title);
final ImageView iconView = (ImageView) tabIndicator.findViewById(R.id.icon);
// when icon is gone by default, we're in exclusive mode
final boolean exclusive = iconView.getVisibility() == View.GONE;
final boolean bindIcon = !exclusive || TextUtils.isEmpty(mLabel);
tv.setText(mLabel);
if (bindIcon && mIcon != null) {
iconView.setImageDrawable(mIcon);
iconView.setVisibility(VISIBLE);
}
if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.DONUT) {
// Donut apps get old color scheme
tabIndicator.setBackgroundResource(R.drawable.tab_indicator_v4);
tv.setTextColor(context.getResources().getColorStateList(R.color.tab_indicator_text_v4));
}
return tabIndicator;
}
}
答案 1 :(得分:1)
请检查此示例是否有效。它是标签栏中的显示徽章