定制的Andr​​oid TabHost慢片段 [英] Custom Android TabHost Slow Fragments

查看:172
本文介绍了定制的Andr​​oid TabHost慢片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用ActionbarSherlock和SlidingMenu。

我的MainActivity不访问数据库,并没有什么都解析。一切都是静止的。

标签生成动态地根据不同的部分您从SlidingMenu选择。经过2单击应用程序变得awefully缓慢。

下面是我的主要观点。
    
    

 < TabHost
        机器人:ID =@机器人:ID / tabhost
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent>        <的LinearLayout
            机器人:layout_width =match_parent
            机器人:layout_height =match_parent
            机器人:方向=垂直>            < TabWidget
                机器人:ID =@机器人:ID /标签
                机器人:layout_width =match_parent
                机器人:layout_height =WRAP_CONTENT
                机器人:方向=横向/>            <的FrameLayout
                机器人:ID =@ + ID / content_frame
                机器人:layout_width =match_parent
                机器人:layout_height =match_parent
                机器人:layout_weight =1
                机器人:背景=#0000FF>
            < /&的FrameLayout GT;            <的FrameLayout
                机器人:ID =@机器人:ID / tabcontent
                机器人:layout_width =0dp
                机器人:layout_height =0dp>            < /&的FrameLayout GT;        < / LinearLayout中>
    < / TabHost>< / LinearLayout中>

用于管理Tabhost&AMP中的code;片段:

 公共无效请选择数据(MenuPag​​eItem页,第subNavigationPage){
    如果(页面== NULL || subNavigationPage == NULL
            || (page.equals(selectedPage)及&放大器; subNavigationPage.equals(selectedSubNavigation))){
        返回;
    }
    Log.d(TAG,显示的页面:+ page.getTitle()+/ subNavigationPage:+ subNavigationPage.getTitle());    布尔needUpdateTabUI =(page.equals(selectedPage))!;
    selectedPage =页;
    selectedSubNavigation = subNavigationPage;    // 1)管理tabHost
    如果(needUpdateTabUI){
        Log.d(TAG,需要更新标签布局);
        updatePageTabUI();
    }
    //更改所选选项卡
    mTabHost.setCurrentTabByTag(selectedSubNavigation.getTitle());    // 2)变更Contentfragment
    Log.d(TAG,更新片段);
    // TODO:检查当前片段尚不是好的,只是
    //调用它的方法了updateData
    updatePageFragment();    //如果打开关闭滑动菜单
    如果(getSlidingMenu()。isShown()){
        处理程序H =新的处理程序();        h.postDelayed(新的Runnable(){
            公共无效的run(){
                。getSlidingMenu()showContent();
            }
        },50);
    }
}私人无效updatePageTabUI(){
    如果(selectedPage.getPages()大小()→1){
        //多个子导航 - >显示标签主机
        // mTab​​Host.setVisibility(View.VISIBLE);
        mTabHost.setup();
        mTabHost.clearAllTabs();
        INT I = 0;
        对于(最后一页subnav:selectedPage.getPages()){
            Log.d(TAG,添加标签标记=+ subnav.getTitle()+称号=+ subnav.getTitle());
            mTabHost.addTab(mTabHost.newTabSpec(subnav.getTitle())。setIndicator(subnav.getTitle())
                    .setContent(新EmptyTabFactory()));
            mTabHost.getTabWidget()。getChildAt(ⅰ).setOnClickListener(新OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){
                    请选择数据(selectedPage,subnav);
                }
            });
            我++;
        }    }其他{
        //只有一个子导航 - >隐藏标签主机
        // mTab​​Host.setVisibility(View.GONE);
        mTabHost.setup();
        mTabHost.clearAllTabs();
    }
    mTabHost.requestLayout();
    mTabHost.invalidate();
}私人无效updatePageFragment(){
    尝试{
        。PageFragment fragContent =(PageFragment)selectedSubNavigation.getFragmentClass()的newInstance();
        fragContent.setSubNavigationPage(selectedSubNavigation);
        FragmentTransaction fragmentTransaction = getSupportFragmentManager()调用BeginTransaction()。
        fragmentTransaction.replace(R.id.content_frame,fragContent);
        fragmentTransaction.commit();
    }赶上(InstantiationException E){
        e.printStackTrace();
    }赶上(IllegalAccessException E){
        e.printStackTrace();
    }
}


解决方案

@Marko答案是不坏,我只是碰巧发现了'真正的'罪魁祸首。我将探索马尔科指出的路径。

我发现的是,SlidingMenu适配器内部,我们有一个ViewBadger(LIB),它是不正确重新使用,创建视图每次我们改变片段的时间。

  BadgeView B =新BadgeView(getActivity(),holder.icon);
holder.badger = B;
convertView.setTag(保持器);

I use ActionbarSherlock and SlidingMenu.

My MainActivity does not access a DB and no Parsing of what ever. Everything is static.

Tabs are generated dynamicly depending on the "Section" you choose from the SlidingMenu. After 2 click the app becomes awefully slow.

Below is my main view.

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

The code used to manage Tabhost & Fragments :

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();
    }
}

解决方案

@Marko answer isn't bad, I just happen to found the 'real' culprit. I will be exploring the path Marko pointed out.

What I found is that inside SlidingMenu adapter we had a ViewBadger (lib) and it wasn't re-used properly, creating views each time we change fragment.

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

这篇关于定制的Andr​​oid TabHost慢片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆