问题描述
我用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;片段:
公共无效请选择数据(MenuPageItem页,第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){
//多个子导航 - >显示标签主机
// mTabHost.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);
}
});
我++;
} }其他{
//只有一个子导航 - >隐藏标签主机
// mTabHost.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);
这篇关于定制的Android TabHost慢片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!