自定义Android TabHost慢速片段

时间:2013-05-14 14:18:45

标签: android android-layout android-fragments android-tabhost

我使用ActionbarSherlock和SlidingMenu。

我的MainActivity无法访问数据库,也无法解析任何问题。一切都是静止的。

根据您从SlidingMenu中选择的“Section”动态生成制表符。 2点击后,应用程序变得非常慢。

以下是我的主要观点。          

    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" />

            <FrameLayout
                android:id="@+id/content_frame"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#0000FF" >
            </FrameLayout>

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="0dp"
                android:layout_height="0dp" >

            </FrameLayout>

        </LinearLayout>
    </TabHost>

</LinearLayout>

用于管理Tabhost&amp;的代码碎片:

public void selectPage(MenuPageItem page, Page subNavigationPage) {
    if (page == null || subNavigationPage == null
            || (page.equals(selectedPage) && subNavigationPage.equals(selectedSubNavigation))) {
        return;
    }
    Log.d(TAG, "Show the page: " + page.getTitle() + " / subNavigationPage: " + subNavigationPage.getTitle());

    boolean needUpdateTabUI = !(page.equals(selectedPage));
    selectedPage = page;
    selectedSubNavigation = subNavigationPage;

    // 1) Manage tabHost
    if (needUpdateTabUI) {
        Log.d(TAG, "need to update tab layout");
        updatePageTabUI();
    }
    // Change selected tab
    mTabHost.setCurrentTabByTag(selectedSubNavigation.getTitle());

    // 2) Change Contentfragment
    Log.d(TAG, "update fragment");
    // TODO: check the current fragment is not already the good one and just
    // call its updateData method
    updatePageFragment();

    // Close the sliding menu if opened
    if (getSlidingMenu().isShown()) {
        Handler h = new Handler();

        h.postDelayed(new Runnable() {
            public void run() {
                getSlidingMenu().showContent();
            }
        }, 50);
    }
}

private void updatePageTabUI() {
    if (selectedPage.getPages().size() > 1) {
        // More than one sub navigation -> show the tab host
        // mTabHost.setVisibility(View.VISIBLE);
        mTabHost.setup();
        mTabHost.clearAllTabs();
        int i = 0;
        for (final Page subnav : selectedPage.getPages()) {
            Log.d(TAG, "add tab tag=" + subnav.getTitle() + " title=" + subnav.getTitle());
            mTabHost.addTab(mTabHost.newTabSpec(subnav.getTitle()).setIndicator(subnav.getTitle())
                    .setContent(new EmptyTabFactory()));
            mTabHost.getTabWidget().getChildAt(i).setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    selectPage(selectedPage, subnav);
                }
            });
            i++;
        }

    } else {
        // Only one sub navigation -> hide the tab host
        // mTabHost.setVisibility(View.GONE);
        mTabHost.setup();
        mTabHost.clearAllTabs();
    }
    mTabHost.requestLayout();
    mTabHost.invalidate();
}

private void updatePageFragment() {
    try {
        PageFragment fragContent = (PageFragment) selectedSubNavigation.getFragmentClass().newInstance();
        fragContent.setSubNavigationPage(selectedSubNavigation);
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.content_frame, fragContent);
        fragmentTransaction.commit();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

2 个答案:

答案 0 :(得分:1)

您将整个工作保留在UIThread上,因此您最终会偶然发现响应缓慢(例如,这是最新Android操作系统禁止在UI线程上进行网络连接的原因之一)。尝试稍微改变你的概念,并在不同的线程上在后台创建选项卡。或者至少在您完成工作时锁定UI和显示等待对话框,以便用户获得适当的UI体验。

希望这有助于并享受您的工作。

答案 1 :(得分:1)

@Marko答案还不错,我恰好发现了'真正'的罪魁祸首。我将探索Marko所指出的道路。

我发现在SlidingMenu适配器中我们有一个ViewBadger(lib)并且没有正确使用它,每次我们更改片段时都会创建视图。

BadgeView b = new BadgeView(getActivity(), holder.icon);
holder.badger = b;
convertView.setTag(holder);