Панель действий Android: настраиваемые вкладки и переполнение

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

Я смог убить все родные стили, используя

<style name="customActionBarTabStyle">
    <item name="android:background">#00000000</item>
</style>

а затем используйте Tab.setIcon(), чтобы вкладки выглядели так, как мне нужно, но мне нужно, чтобы они реагировали на переключение (путем переключения между двумя Drawables - для состояния включения и выключения).

Я попытался создать селектор Drawable следующим образом:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/btn_on" />
    <item android:drawable="@drawable/btn_off" />
</selector>

но вкладки не переключаются в нажатый режим при выборе.

Кроме того, я пробовал вызывать Tab.setIcon() в TabListener.onTabSelected() и .onTabUnselected() - тоже не повезло.

Кто-нибудь знает хорошее решение для этого?

Кроме того, мне нужно отобразить пользовательское представление вместо меню переполнения - я уже нагуглил кучу «подсказок», чтобы переосмыслить свой пользовательский интерфейс, чтобы «следовать пути Android», но проблема в том, что пользовательский интерфейс на самом деле не мой, чтобы переосмыслить - это клиент :), поэтому я действительно хотел бы найти способ обойти недостатки настройки ActionBar.

Любые предложения очень ценятся, спасибо заранее.


person Ivan Bartsov    schedule 21.03.2011    source источник
comment
Вы используете собственный значок вообще без фона? Какого образа вы пытаетесь достичь?   -  person alexanderblom    schedule 21.03.2011
comment
Нет, <style name="customActionBarTabStyle"> <item name="android:background">#00000000</item> </style> переопределяет фон вкладки по умолчанию, чтобы избавиться от собственного подчеркнутого вида, а селектор отображается как значок вкладки на прозрачном фоне вкладки. Это не касается собственного фона ActionBar — он там и подрисован под значками вкладок и прозрачным фоном вкладок.   -  person Ivan Bartsov    schedule 27.04.2011


Ответы (4)


Попробуйте использовать state_selected вместо state_pressed, просто попробуйте сделать что-то подобное здесь (полностью изменив фоновые изображения для вкладок), и кажется, что вкладки панели действий вводят только выбранное значение true/false, но не нажатое состояние...

РЕДАКТИРОВАТЬ: похоже, что свойство фона входит в это состояние, но не цвет текста, используемый на вкладках...

person Markus    schedule 24.06.2011
comment
Хм, спасибо, я обязательно попробую это, чтобы увидеть, работает ли это) На самом деле, проблема была решена (не мной, к сожалению), путем применения пользовательских представлений к вкладкам - вместо пользовательских Drawables. ImageView tab = (ImageView) (getLayoutInflater().inflate(R.layout.mytab, null)); getActionBar().newTab().setCustomView(tab);, а затем переключать нажатые/ненажатые значки в методах прослушивателя вкладок onTabSelected()/onTabUnselected(), например так ((ImageView) tab.getCustomView()).setImageDrawable(...) Вы также пытаетесь использовать разные цвета текста для состояний? Такой подход тоже может помочь. - person Ivan Bartsov; 25.06.2011
comment
Чтобы заставить нажатое состояние работать, вам нужно добавить: android:duplicateParentState=true к любым дочерним представлениям в пользовательском представлении вкладок. - person taf; 04.08.2011

я думаю, что вам придется использовать android:selectableItemBackground, посмотрите на это может помочь.

Удачи

person Hosni    schedule 22.02.2012

Просто чтобы сделать решение более презентабельным:

@taf сказал решение: вам нужно установить android:duplicateParentState="true" в родительском макете, который вы используете в качестве пользовательского представления для своей вкладки.

person WarrenFaith    schedule 15.08.2012

Вот мой код и значок меняются при выборе вкладки и меняются обратно, когда они не выбраны.

    public class MainActivity extends FragmentActivity implements ActionBar.TabListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       requestWindowFeature(Window.FEATURE_ACTION_BAR);
       setContentView(R.layout.activity_main);

       // Set up the action bar.
       final ActionBar actionBar = getActionBar();
       actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
       actionBar.setBackgroundDrawable(null);

    icons = new int[] {
            R.drawable.ic_facebook,
            R.drawable.ic_facebook,
            R.drawable.ic_facebook,
            R.drawable.ic_facebook,
    };
    icons_selected = new int[] {
            R.drawable.ic_launcher,
            R.drawable.ic_launcher,
            R.drawable.ic_launcher,
            R.drawable.ic_launcher,
    };


    // For each of the sections in the app, add a tab to the action bar.
    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        // Create a tab with text corresponding to the page title defined by
        // the adapter. Also specify this Activity object, which implements
        // the TabListener interface, as the callback (listener) for when
        // this tab is selected.
        actionBar.addTab(
                actionBar.newTab()
                        .setText(mSectionsPagerAdapter.getPageTitle(i))
                        .setIcon(icons[i])
                        .setTabListener(this)
        );
    }
    }

и это

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction){

    getActionBar().getSelectedTab().setIcon(icons_selected[tab.getPosition()]);
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    getActionBar().getSelectedTab().setIcon(icons[tab.getPosition()]);
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }
person Krit    schedule 20.06.2014