动态添加指标到tabhost图标android

时间:2014-08-06 14:12:20

标签: android android-tabhost android-xml android-tabs

我在Android应用中使用Tabhost进行导航。一切正常,但是我的一个标签是用于消息,如果用户至少有一条消息,我想在显示用户拥有的消息数量的标签图标中添加一个文本视图。所以基本上我有下面的图标和文本消息,并希望在选项卡图标的右上角有一个显示消息计数的附加文本视图。

我发现了与向标签添加文字相关的帖子,但它只是修改了现有的标签指示文字视图。是否可以在选项卡上添加一个我可以引用的文本视图,并设置为可见性正常,如果存在消息,则将可见性更新为可见并显示计数?

我猜我需要为此标签创建自定义XML布局,并在调用时使用它

.setIndicator("Messages",res.getDrawable(R.drawable.tab_messages))

非常感谢任何见解或示例,谢谢!!

2 个答案:

答案 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)

请检查此示例是否有效。它是标签栏中的显示徽章

TAB_BAR SHOWING NUMBER