自定义 Android TabHost 慢片段

2023-12-19

我使用 ActionbarSherlock 和 SlidingMenu。

我的 MainActivity 不访问数据库,也不解析任何内容。一切都是静态的。

根据您从滑动菜单中选择的“部分”动态生成选项卡。单击 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 和 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();
    }
}

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

希望这对您有所帮助并享受您的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 Android TabHost 慢片段 的相关文章

  • 确定是否在已取得 root 权限的设备上运行

    我的应用程序具有某些功能 该功能只能在具有 root 权限的设备上运行 与其让此功能在使用时失败 然后向用户显示适当的错误消息 我更喜欢能够先默默地检查 root 是否可用 如果不可用 则首先隐藏相应的选项 有没有办法做到这一点 这是一个类
  • 在phonegap中播放本地声音

    我有一个 wav文件在我的www文件夹 我正在使用 jQuery 和以下代码 警报响起 但声音不播放 难道我做错了什么
  • 更改首选项的背景颜色

    我有一个PreferenceCategory xml 文件 我已经在其中定义了所有首选项 我从扩展的类中调用它PreferenceActivity 我无法设置设置屏幕的背景 该屏幕是在如下所示的 xml 文件的帮助下显示的 请看我已经定义了
  • 如何使用 Android 版 Facebook 同步的联系人图片

    我的手机上安装了 Android 版 Facebook 它会自动将联系人列表中人员的 FB 个人资料图片同步到我的手机 我想在我访问的应用程序中使用这些图片ContactsContract PhoneLookup 我真的需要 Faceboo
  • fresco 的 Proguard 错误

    我正在使用 ProGuard 当我在发布配置中运行项目时 出现以下错误 Warning com facebook imagepipeline bitmaps DalvikBitmapFactory can t find referenced
  • 更改操作栏标题文本颜色

    我正在尝试更改 ActionBar 中标题文本的颜色 但我似乎无法让它工作 这是我尝试使用的风格 在我的应用程序主题中我使用titleTextStyle
  • 如何检测android中的颠倒方向?

    在我的 Android 应用程序中 我有全景图像 并且我使用 TYPE ORIENTATION 传感器根据手机运动旋转该图像 它对于横向和纵向都工作良好 这是旋转逻辑的代码 Override public void onSensorChan
  • 任务“:app:checkReleaseDuplicateClasses”执行失败

    我的 React Native Android 构建中突然出现构建问题 令人惊讶的是 它是早上建好的 没有做任何改变 但突然就失败了 这就是我得到的错误 知道为什么会发生这种情况吗 在 stack 和 GitHub 中也看到了一些类似的问题
  • android - 过度绘制布局允许通过 LinearLayout 进行触摸

    在下面的 UI 中 我将下面的 drabable 覆盖了整个屏幕 LinearLayout 是透明的 并允许其下方的控件可单击或可触摸 基本上我可以滚动此 LinearLayout 下面的列表以及单击控件 我如何禁用它 See attach
  • Android 上通过 JSCH 的基本 SSH 连接

    作为来自此的用户question https stackoverflow com questions 14323661 simple ssh connect with jsch和这个tutorial http eridem net andr
  • Android Things 文件系统

    我正在 Android 上构建这个应用程序 我希望能够让它访问 U 盘上的媒体文件 甚至树莓派的 SD 卡上的媒体文件 我还不知道我将如何处理这些文件 但我只是想知道它是否可能 如果不是这样也没关系 我还有其他解决方案 但我想我会先从明显的
  • 如何在Firebase Android应用程序中分离两个不同的用户?

    我有一个应用程序 有两种不同类型的用户 一种是教师 第二种是普通用户 如果普通会员登录 他会去normal memberActivity如果他是教师会员 他会去Teacher memberActivity 我如何在登录活动中执行此操作 我的
  • 将搜索结果更新为 Android 中的 Lazy Adapter

    我有项目列表 想为其实现搜索功能 因此 我有一个带有 addTextChangedListener 的文本框 搜索结果运行良好 但当我尝试将结果设置为 ListView 时 新结果将附加到旧结果中 我正在使用惰性适配器 如何清除适配器中的旧
  • BluetoothLeScanner 服务内部问题

    Update从Android 10以上我认为你需要ACCESS BACKGROUND LOCATION权限 因此 如果此代码在最新的 Android 版本上不起作用 就是针对此问题的 ACCESS BACKGROUND LOCATION 受
  • Android 将菜单项在操作栏中向左对齐

    我的应用程序中有一个操作栏 它显示我定义的菜单项res menu activity main xml 我的菜单项在操作栏上向右对齐 我希望它们左对齐 我为此找到的唯一解决方案使用了自定义操作栏 如下所示 将菜单项放置在 Honeycomb
  • MPAndroidChart:组合图表

    我在用MPAndroidChart 库 https github com PhilJay MPAndroidChart 我想用CombinedChart创建这样的图表 那可能吗 我尝试了一下 但似乎不起作用 因为 这些条目没有按我的预期工作
  • 使用 eclipse 配置mockito 时出现问题。给出错误:java.lang.verifyError

    当我将我的mockito库添加到类路径中 并使用一个简单的mockito示例进行测试时 我尝试使用模拟对象为函数add返回错误的值 我得到java lang verifyerror 以下是用于测试的代码 后面是 logcat Test pu
  • Android 视图和视图组

    在安卓中ViewGroup继承自View A ViewGroup是一个容器 里面装有Views ViewGroup LinearLayout View TextView 为什么 Android 的人们将这种关系定义为Inheritance而
  • 在Android中提取视频帧

    我想知道是否可以从 Android 中正在运行的视频中提取帧 我需要定期提取帧并将其发送以进行进一步处理 有人能为我找到答案吗 Thanks Abhi 您可以使用媒体元数据检索器 http developer android com ref
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显

随机推荐

  • 使用 window.open() 在特定时间间隔后打开新窗口

    我正在寻找 javascript 代码 它将在特定时间间隔后自动打开新选项卡 窗口 我这里有几个网站 在这段代码中 当我按下 html 页面上的按钮时 这些网站会自动打开 我希望这些网站在特定时间间隔后打开 例如 当用户按下 打开 Wind
  • 在内容可编辑的 div 中设置光标位置

    Summary 我试图达到当用户输入 a 时的效果 or 在内容可编辑的div 第二 or 是自动插入的 并且插入符号位于两者之间 即之间 and FIDDLE http jsfiddle net N6xFx 1 在右侧键入 s 并看看它在
  • 用字符串反应本机创建元素

    我看到很多人在 React Native 中创建类似于以下的路由映射 if route id Blah return
  • Python/Pandas Dataframe 用中值替换 0

    我有一个带有几列的 python pandas 数据框 其中一列有0价值观 我想更换0值与median or mean本专栏的 data是我的数据框 artist hotness是列 mean artist hotness data art
  • 从Spring 3.2.3升级到Spring 4后出错

    将我的网络应用程序从 Spring 3 2 3 升级到 Spring 4 后 我遇到了NoSuchMethodError java lang NoSuchMethodError org springframework security we
  • SQL Server Varbinary(max):从 varbinary 字段中选择字节子集

    在 SQL Server 2008 中从 varbinary MAX 字段 不使用 FileStreams 读取部分二进制数据的最有效方法是什么 将数据写入列时 T SQL 中提供了 VarBinary Write 函数 允许将字节增量写入
  • 从 Zend Framework 2 中的模块发布资产

    通常建议将模块资产存储在模块的目录中moduleName public 或者您想要命名资产目录的任何名称 不幸的是 Zend Framework 2 不支持资产发布默认情况下用于模块资产 根据MWOP 大约 1 个月前没有任何计划 我想仍然
  • 在windows服务中设置端口号

    我要开发一个windows服务 当服务启动时 就会有一个端口 我的问题是我们可以为其分配一个特定的端口号吗 例如 端口号为 55431 是的 假设您使用 WCF 作为通信层 您只需配置要侦听的绑定 协议作为服务配置的一部分 在您的服务中On
  • 重写条件总和和计数查询/日期范围比较的更好方法

    我不确定我所做的尝试是否正确 看来有很多重复的事情 以下示例在本月 上个月运行 但通常我不希望能够设置我的子句以供以后使用 例如 昨天与今天 这是一个简单的比较查询 只是为了让我们更容易 我们在这个 上个月进行操作 我的数据 CREATE
  • 如果log4net日志无法写入数据库,如何设置?

    我知道可以同时登录文件和数据库 也可以登录不止一种资源 https stackoverflow com questions 1372435 configure log4net to write to multiple files 但是如果l
  • 如何使用 Spring data REST 公开自定义 DTO CRUD 存储库?

    我不想公开我的模型类 jpa 实体 而是使用不同的数据传输对象 DTO 公开其属性的不同子集 这个想法是DTO CrudRepository lt gt JpaRepository lt gt entities 我想通过 Spring Da
  • 通过 ng build 构建 Angular 项目时,出现 angular.json 文件未找到错误

    我在笔记本电脑上克隆了一个存储库 该存储库是我一个月前从另一台计算机创建的 我的项目很成功 一个月前没有出现任何错误 但今天在我将存储库克隆到新计算机中后 我遇到了一些错误 其实我写的npm i为了安装软件包 然后我尝试通过构建我的项目ng
  • 计算上传文件的数量

    我正在开发我的 CodeIgniter 项目 到目前为止它运行得很好 但是 我需要某种方法来计算上传文件的数量 因为我想在某些情况下 但不是全部 限制它 我怎样才能做到这一点 我试过count FILES 但这没有给我任何可用的东西 我还尝
  • 了解 AMD GPU 中的 oneAPI 和 SYCL

    我是一名 GPGPU 开发人员 我使用 CUDA 完成了所有工作 最近 我为我的家庭设置购买了 AMD GPU 并且我一直在阅读有关 SYCL 和 oneAPI 的内容 但我不确定我是否理解它们各自是什么以及它们如何互补 如果我理解正确的话
  • 无法读取属性“getText”量角器

    我正在尝试将一个循环插入一个循环并获取Cannot red property getText of undefined error 这是我的代码 element all by className col md 4 ng scope then
  • 重置选择框的值

    我正在尝试重置两个选择字段的值 其结构如下
  • 艰难地学习 Ruby 第 9 章 三引号

    Zed Shaw 的 Learn Ruby the Hard Way 第 9 章使用了三重双引号 puts There s something going on here With the three double quotes We ll
  • 在给定合并提交 SHA1 的情况下,您如何查看/显示已完成的 git 合并冲突解决方案?

    当您解决冲突 然后暂存更改 然后执行 git diff 时 它会显示两列 和 一列代表 我们的 一列代表 他们的 给定存储库的 git 历史记录中的合并提交 我如何查看由其他人完成的解决方案 在其他情况下 我以前见过它 我想是在 gitk
  • 滚动到验证摘要 - ASP.net MVC

    当用户单击应用程序中导致验证错误的按钮时 是否有办法让页面滚动到验证摘要的位置 如果出现错误 我需要对这两种情况执行此操作 客户端验证阻止页面提交 服务器验证重新显示网页 在 MVC 中是否有一种简单的方法可以实现这一点 jquery 滚动
  • 自定义 Android TabHost 慢片段

    我使用 ActionbarSherlock 和 SlidingMenu 我的 MainActivity 不访问数据库 也不解析任何内容 一切都是静态的 根据您从滑动菜单中选择的 部分 动态生成选项卡 单击 2 次后 应用程序变得非常慢 下面