自定义视图未正确显示的堆叠ActionBar选项卡

时间:2014-01-27 22:15:23

标签: android android-actionbar

使用操作栏选项卡时,如果选项卡内容对于显示来说太大,有时它们会显示为“堆叠”。当我使用选项卡内容的自定义视图时会出现问题,它会导致选定的选项卡不显示在下拉列表中,选择选项卡后,下拉列表会消失,并显示小的空选项卡。

以下是选择项目之前下拉列表的屏幕截图:(请注意,即使选中了标签,也不会显示标签的内容) before selecting item

此外,选择项目后,标签不再堆叠,标签的内容为空: after selecting item

这是我的代码,(请注意,我使用标签的自定义视图来演示问题)

public class ExampleActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final TextView selectedTabText = new TextView(this);
        setContentView(selectedTabText);

        ActionBar.TabListener listener = new ActionBar.TabListener() {
            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
                TextView customView = (TextView) tab.getCustomView();
                selectedTabText.setText(customView.getText());
            }

            @Override
            public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {

            }

            @Override
            public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {

            }
        };

        ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        addTab(actionBar, listener, "Tab one with a very long name");
        addTab(actionBar, listener, "Tab two with a very long name");
        addTab(actionBar, listener, "Tab three with a very long name");
        addTab(actionBar, listener, "Tab four with a very long name");
    }

    private void addTab(ActionBar actionBar, ActionBar.TabListener listener, String text) {
        ActionBar.Tab tab = actionBar.newTab();
        TextView textView = new TextView(this);
        textView.setText(text);
        tab.setCustomView(textView);
        tab.setTabListener(listener);
        actionBar.addTab(tab);
    }
}

3 个答案:

答案 0 :(得分:3)

这是一个已知错误,已经报告给错误跟踪器:

https://code.google.com/p/android/issues/detail?id=41392

为了解决这个问题,我通过讨厌的黑客禁用了操作栏折叠行为。应该从onStart活动方法调用以下方法:

/**
 * SUPER hack to disable tab collapsing with smaller screens, which doesn't allow custom tab bar views to be used
 * https://code.google.com/p/android/issues/detail?id=41392
 */
private void disableCollapsibleTabs() {
    try {
        ActionBar actionBar = getActionBar();
        Field actionViewField = actionBar.getClass().getDeclaredField("mTabScrollView");
        actionViewField.setAccessible(true);
        Object mTabScrollView =  actionViewField.get(actionBar);

        Method setAllowCollapse = mTabScrollView.getClass().getDeclaredMethod("setAllowCollapse", boolean.class);
        setAllowCollapse.setAccessible(true);
        setAllowCollapse.invoke(mTabScrollView, false);

    } catch (Exception e) {
        Log.e("", "Error while disabling actionbar collapsible tabs", e);
    }
}

答案 1 :(得分:1)

编辑:结束使用

<android.support.design.widget.TabLayout
    android:id="@+id/tabLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/tint" />`

而不是已弃用的ActionBar标签。 这不会在方向更改时折叠标签栏,但似乎google和facebook的应用程序也是如此(我猜)。

更新:似乎它不起作用,这只是一个副作用。 这似乎是一个时间问题 - &gt;当onConfigurationChanged中的代码需要一点时间时,问题似乎就消失了。 这个非常脏的黑客终于工作了,但它不是一个解决方案(不推荐,也许是其他人找到它的提示):

@Override
public void onConfigurationChanged(Configuration newConfig) {

    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
   super.onConfigurationChanged(newConfig);

}

对我而言,这在我的片段中被调用时起作用。希望它有所帮助。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    final ActionBar actionBar = getActivity()).getSupportActionBar();
    actionBar.invalidateOptionsMenu();
}

答案 2 :(得分:0)

在调用onConfigurationChanged方法时,只需重置自定义选项卡。 这对我有用。 希望它有所帮助。

@Override
public void onConfigurationChanged(Configuration newConfig) {

    try {
        Thread.sleep(100);
        actionBar.getTabAt(0).setCustomView(/*your custom view*/);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    super.onConfigurationChanged(newConfig);


}