Управление состоянием / размером вкладки в TabActivity? - PullRequest
5 голосов
/ 23 марта 2011

Хорошо, это сводит меня с ума - я искал все ссылки и примеры, которые я могу найти, и я все еще, кажется, упускаю что-то действительно очевидное.Это вкладки для 7-дневного телегида (обычно не с красной стрелкой, очевидно :)) ...

enter image description here

Что мне нужно знать, так это то, чтообъект (View или Drawable, я полагаю), который составляет основное тело / фон самой вкладки?(как указано красной стрелкой) и как я могу получить к нему доступ или автоматически изменить цвет своего состояния на список по своему выбору?Кроме того, как я могу получить цвет состояния индикатора TextView, чтобы он соответствовал этому примеру?

Пример: в приведенном выше снимке он читается, потому что я установил для textColor статический серый (вместо яркого белогоисчез на выбранной вкладке).Но я хочу, чтобы он автоматически стал черным текстом на белой вкладке (выделено) и ярко белым текстом на черном (для невыбранного).

Вся помощь с благодарностью получена.

Ответы [ 2 ]

6 голосов
/ 15 апреля 2011

Вид, представляющий каждую вкладку, можно изменить с помощью

setIndicator(View)

Я использовал этот код для создания каждой вкладки:

View view = buildTabView(this, "Friday");
TabHost.TabSpec spec = tabHost.newTabSpec("cat1").setIndicator(view).setContent(intent);
tabHost.addTab(spec);

public static LinearLayout buildTabView(Context context, String label){
    LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);          
    final LinearLayout ll = (LinearLayout)li.inflate(R.layout.tab, null);

    // the following lines will change the tabs size depending on the label (text) length.
    // the longer tab text - the wider tabs
    LinearLayout.LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, label.length() + 1);
    ll.setLayoutParams(layoutParams);

    final TextView tv = (TextView)ll.findViewById(R.id.tab_tv);         
    tv.setOnTouchListener(new OnTouchListener() {               
        public boolean onTouch(View v, MotionEvent event) {
            ll.onTouchEvent(event);
            return false;
        }
    });

    tv.setText(label);          
    return ll;
}

И вот идет макет / вкладка.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:background="@drawable/tab_bg_selector"
  android:clickable="true"
  >

  <TextView
  android:id="@+id/tab_tv"
  android:layout_width="wrap_content"
  android:layout_height="33dip"
  android:text="Text 1"
  android:textStyle="bold"
  android:textSize="16dip"
  android:gravity="center"
  android:textColor="@drawable/tab_color_selector"
  android:layout_weight="1.0"
  android:clickable="true"
  />

</LinearLayout>

Обратите внимание, что LinearLayout имеет селектор на фоне (для изменения фона, очевидно :)), а TextView имеет селектор на textColor (для изменения цвета текста при выборе / нажатии и т. д.).Таким образом, вы можете сделать текст черным при нажатии клавиши Tab и белым, если его нет:)

2 голосов
/ 18 апреля 2011

Пожалуйста, обновите ваш вопрос с помощью кода, который вы используете. Используете ли вы XML внутри вашего Drawable для анимации вкладок?Вот пример обработки действий вкладок с использованием XML.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- When selected, use grey -->
    <item android:drawable="@drawable/ic_tab_about_grey"
          android:state_selected="false" />
    <!-- When not selected, use white-->
    <item android:drawable="@drawable/ic_tab_about_color" android:state_selected="true"/>
</selector>

Настройка поведения вкладок и значков с использованием этого XML-файла.

Ниже приведен код для настройки параметров анимации / настройки на вкладках:

intent = new Intent().setClass(this, sms.class);
spec = tabHost.newTabSpec("sms").setIndicator("SMS",
       res.getDrawable(R.drawable.ic_tab_sms))
       .setContent(intent);
tabHost.addTab(spec);

Теперь XML в макете для определения tab-host и tab-widgets.

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            />
</TabHost>

Настройте этот XML-макет с вашими собственными цветами, шрифтами и структурой.

...