Android操作栏: 自定义选项卡和溢出菜单

4

我很难实现自定义样式的操作栏标签:我需要使标签(我指的是按钮)在正常和选定状态下使用自定义图形。

我已经能够使用以下方法消除所有本地样式:

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

然后使用Tab.setIcon()来使选项卡看起来符合我的需求,但我需要它们能够响应切换(通过在两个可绘制对象之间切换 - 用于开和关状态)。

我尝试创建一个这样的可绘制选择器:

<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>

但是选中后,选项卡并没有切换到按下模式。
另外,我尝试在TabListener.onTabSelected()和.onTabUnselected()中调用Tab.setIcon(),但也没有成功。
有人知道一个好的解决方案吗?
此外,我需要显示自定义视图而不是溢出菜单 - 我已经在谷歌上搜索了许多“提示”,要求重新考虑我的UI以“遵循Android方式”,但问题实际上是UI不是我的-它是客户的:)所以我真的很想找到一种绕过ActionBar的自定义缺点的方法。
非常感谢您提供任何建议。

你是否正在使用没有任何背景的自定义图标?你想要实现什么样的外观效果? - alexanderblom
不,<style name="customActionBarTabStyle"> <item name="android:background">#00000000</item> </style> 覆盖了默认的选项卡背景 - 为了摆脱本地下划线外观,选择器被绘制为选项卡图标覆盖在透明的选项卡背景上。这与 ActionBar 自己的背景无关 - 它存在并且在选项卡图标和透明的选项卡背景下绘制。 - Ivan Bartsov
4个回答

1

尝试使用state_selected代替state_pressed,我只是在尝试完全更改选项卡的背景图像时做类似的事情,似乎操作栏选项卡仅进入true / false选择状态而不是按下状态...

编辑:看起来背景属性进入该状态,但标签上使用的文本颜色没有...


嗯,谢谢,我一定会尝试看看它是否有效。实际上,这个问题已经解决了(不幸的是不是我解决的),通过将自定义视图应用于选项卡 - 而不是自定义可绘制对象。ImageView tab = (ImageView) (getLayoutInflater().inflate(R.layout.mytab, null)); getActionBar().newTab().setCustomView(tab);然后在选项卡侦听器的onTabSelected()/onTabUnselected()方法中切换按下/未按下的图标,如下所示((ImageView) tab.getCustomView()).setImageDrawable(...)您是否也尝试使用不同的文本颜色来表示状态?这种方法也可能有所帮助。 - Ivan Bartsov
1
为使按下状态正常工作,您需要在自定义选项卡视图中的任何子视图中添加:android:duplicateParentState="true"。 - taf

0

这是我的代码,当选中一个选项卡时图标会改变,取消选中时会恢复原样。

    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) {
    }

0

为了更清晰地呈现解决方案:

@taf 提出了解决方案:您需要在用作选项卡自定义视图的父布局中设置 android:duplicateParentState="true"


0

我认为你需要使用 android:selectableItemBackground,看一下this 或许会有帮助。

祝好运


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接