Android: хост вкладок, где каждая вкладка имеет значок непрочитанного количества - PullRequest
1 голос
/ 07 апреля 2011

Мне нужно написать панель вкладок, где каждая из спецификаций вкладок имеет вид индикатора, который содержит изменяемый числовой значок. представьте читателя новостей с вкладками, где каждая вкладка имеет свой непрочитанный счетчик

Что я сделал, так это создал макет xml для указателя вкладок, накачал его в коде и связал со спецификацией вкладки следующим образом: 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):

    @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. Просто кажется, что это слишком сложный подход

У меня вопрос, можете ли вы предложить лучший способ сделать это? Есть ли другой подход, который я не учел? Спасибо!

1 Ответ

0 голосов
/ 08 апреля 2011

Пара вещей.

Используйте RelativeLayout.Это может помочь с проблемой 3, поскольку позволяет лучше контролировать расположение этих элементов в макете.

Вы должны использовать атрибуты android: id со всеми или с вашими элементами xml.Таким образом, вы можете установить свое представление в xml, но все равно вносить в него изменения программным способом, что должно помочь в проблеме 2. Например, если бы вы присвоили свой TextView атрибут id, вам не нужно было бы жестко кодировать атрибут text.

В вашем xml,

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

И в вашей java,

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

В общем, я не думаю, что это , что запутано, но это, безусловно, может быть улучшено.

...