android:一个标签主机,其中每个标签都有一个未读计数标记

时间:2011-04-07 17:50:33

标签: android user-interface android-layout android-widget android-tabhost

我需要编写一个标签栏,其中每个tabspec都有一个包含可变数字徽章的指示器视图。 想象一个带标签的新闻阅读器,其中每个标签都有自己未读的计数

我所做的是为tab inidicator创建一个xml布局,在代码中对其进行膨胀并将其与tabspec相关联,如下所示: tab_indicator.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:orientation="vertical" android:paddingLeft="10dip"
    android:paddingRight="10dip">
    <FrameLayout android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:paddingTop="5dip">

        <ImageView android:src="@drawable/tab_selector_friends"
            android:layout_width="wrap_content" android:layout_height="wrap_content" />
        <TextView android:text="2" 
            android:layout_width="10dip" android:layout_height="10dip" 
            android:textColor="@color/white_text"
            android:textStyle="bold" android:typeface="monospace"
            android:paddingLeft="1dip" android:paddingRight="1dip"
            android:textSize="10dip" android:gravity="center" android:background="@drawable/temp_red_badge_big" />

    </FrameLayout>
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:text="Friends" />
</LinearLayout>

我的标签小部件(MyTabWidget.java的oncreate metod):

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab_menu);

    TabHost tabHost = getTabHost();
    Intent intent = new Intent().setClass(this, TodayActivity.class);
    Resources resources = this.getResources();  
    TabHost.TabSpec spec = tabHost.newTabSpec(resources.getString(R.string.today));
    View specIndicatorView;
    LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    specIndicatorView = inflater.inflate(R.layout.tab_indicator, null);
    spec.setIndicator(specIndicatorView);
    spec.setContent(intent);
    tabHost.addTab(spec);

这种方法存在几个问题:

  1. 非常复杂且难以维护
  2. 它无法为我提供所需的灵活性,即更改徽章的价值
  3. 很难以一种看起来不错的方式设计它
  4. 这似乎是一种过于复杂的方法
  5. 我的问题是,你能建议一个更好的方法吗?我有没有考虑过不同的方法? 谢谢!

1 个答案:

答案 0 :(得分:0)

一些事情。

使用RelativeLayout。这可能对问题3有所帮助,因为它允许更多地控制这些元素在布局中的位置。

你应该在所有或你的xml元素中使用android:id属性。这样您就可以在xml中设置视图,但仍然以编程方式对其进行更改,这应该有助于解决问题2.例如,如果您要为TextView提供id属性,则不需要对text属性进行硬编码。

在你的xml中,

<TextView android:id="count"
...
/>

在你的java中,

TextView count = (TextView) findViewById(R.id.count);
count.setText(friendsCount);

一般来说,我认为 并非如此,但它肯定可以改进。