android自定义标签布局选择标签背景

时间:2013-06-16 16:13:16

标签: android android-tabhost android-tabs android-selector

我正在设置一个小应用程序,这需要一个标签布局。我用片段实现了所有东西,一切都运行得很好,我唯一不能理解的是所选标签的背景:这就是我做的:

我从“tab and pager”ActionBarSherlock的样本开始。我已将选项卡放在Horizo​​ntal scrollview中,并在drawable文件夹中创建了以下名为tab_bg_selector的选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!--  Active tab -->
    <item android:state_selected="true" android:state_focused="false"
        android:state_pressed="false" android:drawable="@drawable/tab_selected" />
    <!--  Inactive tab -->
    <item android:state_selected="false" android:state_focused="false"
        android:state_pressed="false" android:drawable="@drawable/tab_deselected" />
    <!--  Pressed tab -->
    <item android:state_pressed="true" android:drawable="@android:color/transparent" />
    <!--  Selected tab (using d-pad) -->
    <item android:state_focused="true" android:state_selected="true"
        android:state_pressed="false" android:drawable="@android:color/transparent" />
</selector>

并以这种方式添加标签

mTabsAdapter.addTab(getTabSpec(STEPS.STEP1_MATERIAL, "firstTab"), FirstTab.class, null);

其中mTabsAdapter是一个扩展FragmentPagerAdapter的类(由示例的开发人员创建,下面是为了完整性所有代码)和getTabSpec是

public TabSpec getTabSpec(String tag, String title) {
        View tabview;
        TabSpec ts;

        tabview = createTabView(mTabHost.getContext(), title);

        ts = this.mTabHost.newTabSpec(tag).setIndicator(tabview).setContent(new TabContentFactory() {
            public View createTabContent(String tag) {
                return new TextView(getApplicationContext());
            }
        });
        return ts;
    }

和createTabView是

private View createTabView(final Context context, final String text) {
        View view = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null);
        TextView tv = (TextView) view.findViewById(R.id.tabsText);
        tv.setText(text);
        return view;
    }

R.layout.tabs_bg是

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tabsLayout" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:background="@drawable/tab_bg_selector"
    android:padding="10dip" android:gravity="center" android:orientation="vertical">

    <TextView android:id="@+id/tabsText" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:text="Title"
        android:textSize="15dip" android:textColor="@drawable/tab_text_selector" />
</LinearLayout>

tab_text_selector就是这个

                   

这是mTabAdapter是一个实例的类

/**
     * This is a helper class that implements the management of tabs and all
     * details of connecting a ViewPager with associated TabHost. It relies on a
     * trick. Normally a tab host has a simple API for supplying a View or
     * Intent that each tab will show. This is not sufficient for switching
     * between pages. So instead we make the content part of the tab host
     * 0dp high (it is not shown) and the TabsAdapter supplies its own dummy
     * view to show as the tab content. It listens to changes in tabs, and takes
     * care of switch to the correct paged in the ViewPager whenever the selected
     * tab changes.
     */
    public class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
        private final Context mContext;
        private final TabHost mTabHost;
        private final ViewPager mViewPager;
        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
        private TabInfo mLastTab = null;

        final class TabInfo {
            public final String tag;
            public final Class<?> clss;
            public final Bundle args;
            public Fragment fragment;

            TabInfo(String _tag, Class<?> _class, Bundle _args) {
                tag = _tag;
                clss = _class;
                args = _args;
            }
        }

        class TabFactory implements TabHost.TabContentFactory {
            private final Context mContext;

            public TabFactory(Context context) {
                mContext = context;
            }

            @Override
            public View createTabContent(String tag) {
                View v = new View(mContext);
                v.setMinimumWidth(0);
                v.setMinimumHeight(0);
                return v;
            }
        }

        public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) {
            super(activity.getSupportFragmentManager());
            mContext = activity;
            mTabHost = tabHost;
            mViewPager = pager;
            mTabHost.setOnTabChangedListener(this);
            mViewPager.setAdapter(this);
            mViewPager.setOnPageChangeListener(this);
        }

        public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
            tabSpec.setContent(new TabFactory(mContext));
            String tag = tabSpec.getTag();

            TabInfo info = new TabInfo(tag, clss, args);

            info.fragment = getSupportFragmentManager().findFragmentByTag(tag);
            mTabs.add(info);
            mTabHost.addTab(tabSpec);
            notifyDataSetChanged();
        }


        @Override
        public int getCount() {
            return mTabs.size();
        }

        @Override
        public Fragment getItem(int position) {
            TabInfo info = mTabs.get(position);
            return Fragment.instantiate(mContext, info.clss.getName(), info.args);
        }

        @Override
        public void onTabChanged(String tabId) {
            int position = mTabHost.getCurrentTab();
            mViewPager.setCurrentItem(position);

            try {
                TabInfo newTab = (TabInfo) mTabs.get(position);// this.mapTabInfo.get(tag);
                if (mLastTab != newTab) {
                    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                    if (mLastTab != null) {

                        if (mLastTab.fragment != null) {
                            ft.detach(mLastTab.fragment);
                        }
                    }
                    if (newTab != null) {
                        if (newTab.fragment == null) {
                            newTab.fragment = Fragment.instantiate(TabFragment.this, newTab.clss.getName(), newTab.args);
                            ft.add(android.R.id.tabcontent, newTab.fragment, newTab.tag);
                        } else {
                            ft.attach(newTab.fragment);
                        }

                    }

                    mLastTab = newTab;
                    ft.commit();
                    getSupportFragmentManager().executePendingTransactions();
                }
            } catch (Exception e) {
                LogHelper.WriteLogError("error in onTabChanged function", e);
            }
        }

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
            // Unfortunately when TabHost changes the current tab, it kindly
            // also takes care of putting focus on it when not in touch mode.
            // The jerk.
            // This hack tries to prevent this from pulling focus out of our
            // ViewPager.
            // TabWidget widget = mTabHost.getTabWidget();
            // int oldFocusability = widget.getDescendantFocusability();
            // widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
            mTabHost.setCurrentTab(position);
//          mTabHost.getTabWidget().focusCurrentTab(position);
            // widget.setDescendantFocusability(oldFocusability);
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
    }

好的,这里的所有代码都是问题所在:

非选定选项卡的选择器工作正常(除了textColor是白色而不是黑色),但是当我选择一个选项卡时,选项卡变为完全黑色,我再次单击选项卡上的所有内容都正确显示。这是一个更好地解释问题的图像

enter image description here

我真的无法弄清楚问题是什么,我希望有人可以问我

感谢

编辑:我发现了问题:在标签布局的初始化过程中,我已将所有标签放在触摸模式下可聚焦,因为当我需要显示一个不可见的标签时(标签可以很多) )使用

mTabHost.getTabWidget().focusCurrentTab(position)

如果我没有将标签设置为可在触摸模式下对焦,则无效。

我可以解决这个问题吗?

感谢

0 个答案:

没有答案