1

Мне нужно написать панель вкладок, где каждый из таблеток имеет вид индикатора, который содержит изменяемый числовой значок. себе вкладками для чтения новостей, где каждая вкладка имеет свой собственный Количество непрочитанныхandroid: хост вкладки, на котором у каждой вкладки есть непрочитанный значок счетчика

То, что я сделал, это создать макет XML для вкладки inidicator, накачал его в коде и ассоциировали его с 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> 

мой виджет со вкладками (OnCreate Metod из 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. Кажется, что это слишком сложно подход

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

ответ

0

Пара вещей.

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

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

В вашем XML,

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

И в вашей Яве,

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

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

Смежные вопросы