操作栏下的进度栏

2023-12-11

问题摘要:我怎样才能做一个ProgressBar集成在内部ActionBar,就像在 Chrome 应用程序上一样?

Details:看一下 Chrome 的截图:

Chrome for Android screenshot

我想创建一个像这样的操作栏。在操作栏的正下方,有一个进度条,它根据页面加载情况进行填充。我在许多应用程序(例如 Feedly)中看到过这个示例,但我无法创建自己的实现。我尝试使用Android自己的API来创建它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    //Request Permission to display the Progress Bar...
    this.requestWindowFeature(Window.FEATURE_PROGRESS);
            this.setWindowContentView(R.layout.activity_main)
    super.onCreate(savedInstanceState);

    this.setProgressBarIndeterminate(true);
}

但这段代码只会导致 ProgressBar 显示over操作栏,如下所示:

My App Screenshot

那么,如何让我的进度栏出现在操作栏下方,就像在 Chrome 应用程序上一样?


我对上面接受的答案并不完全满意,所以我自己做了一些额外的研究。

我相信他们使用的技巧是他们检索了视图层次结构中的顶部视图,称为DecorView并在那里添加了进度条。这样,进度条就会显示在操作栏和内容区域上。请注意,S.D. 的答案将进度条放入内容区域并从实际内容中“窃取”空间,这可能会导致意外结果。

Sample 截图此实施的:

ProgressBar

ProgressBarIndeterminate

Code

只需将这段代码放入onCreate某些活动的方法,它应该有效:

// create new ProgressBar and style it
final ProgressBar progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
progressBar.setProgress(65);

// retrieve the top view of our application
final FrameLayout decorView = (FrameLayout) getWindow().getDecorView();
decorView.addView(progressBar);

// Here we try to position the ProgressBar to the correct position by looking
// at the position where content area starts. But during creating time, sizes 
// of the components are not set yet, so we have to wait until the components
// has been laid out
// Also note that doing progressBar.setY(136) will not work, because of different
// screen densities and different sizes of actionBar
ViewTreeObserver observer = progressBar.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        View contentView = decorView.findViewById(android.R.id.content);
        progressBar.setY(contentView.getY() - 10);

        ViewTreeObserver observer = progressBar.getViewTreeObserver();
        observer.removeOnGlobalLayoutListener(this);
    }
});

您可以使用 LayoutParams 的 height 参数来设置进度条更宽或更窄,但您可能需要调整-10 offset.

Styling

不幸的是,您可以看到进度条丑陋的灰色背景。要删除它,简单地通过 id 搜索背景并尝试隐藏它是行不通的。要删除背景,我必须创建与系统版本相同的绘图并删除背景项目。

TL;DR:创建文件progress_horizontal_holo_no_background_light.xml并粘贴此绘图:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/secondaryProgress">
        <scale android:scaleWidth="100%"
               android:drawable="@drawable/progress_secondary_holo_light" />
    </item>

    <item android:id="@android:id/progress">
        <scale android:scaleWidth="100%"
               android:drawable="@drawable/progress_primary_holo_light" />
    </item>

</layer-list>

从以下位置复制适当的 .png 绘图sdk/platforms/android-xx/data/res/drawable-xxx/到您的项目,然后在代码中您可以添加:

progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light));

额外:不确定的进度条

KitKat 之前版本的不确定进度条非常丑陋且滞后。 您可以下载名为的新平滑进度条ButteryProgressBar。只需在谷歌上搜索它(我无法发布更多链接,因为我是新来的:[),将类添加到您的项目中,您可以简单地用此代码替换以前的 ProgressBar 并获得清晰的不确定进度条:

final ButteryProgressBar progressBar = new ButteryProgressBar(this);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));

您可能还需要简化此代码:

final TypedArray ta = c.obtainStyledAttributes(attrs, R.styleable.ButteryProgressBar);
try {
    mBarColor = ta.getColor(R.styleable.ButteryProgressBar_barColor,
            c.getResources().getColor(android.R.color.holo_blue_light));
    mSolidBarHeight = ta.getDimensionPixelSize(
            R.styleable.ButteryProgressBar_barHeight,
            Math.round(DEFAULT_BAR_HEIGHT_DP * mDensity));
    mSolidBarDetentWidth = ta.getDimensionPixelSize(
            R.styleable.ButteryProgressBar_detentWidth,
            Math.round(DEFAULT_DETENT_WIDTH_DP * mDensity));
} finally {
    ta.recycle();
}

到这段代码:

mBarColor = c.getResources().getColor(android.R.color.holo_blue_light);
mSolidBarHeight = Math.round(DEFAULT_BAR_HEIGHT_DP * mDensity);
mSolidBarDetentWidth = Math.round(DEFAULT_DETENT_WIDTH_DP * mDensity);

希望我有帮助:)

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

操作栏下的进度栏 的相关文章

随机推荐

  • 关于传统解释器、编译器和 JIT 编译器/解释器的澄清

    我正在学习 Java 以下事情对我来说有点困惑 我的理解是 Java编译器 Java 编译器只是转换 java程序进入 class文件 这意味着将我们的源代码转换为字节码 它是虚拟机 JVM 的操作码列表 这使得 Java 平台无关 Jav
  • 这是一个错误的 REST URL 吗?

    我刚刚阅读了有关 REST URL 的内容并看到了以下示例 API 用户 获取用户 现在 如果使用动词 GET 通过 HTTP 进行访问 这不是一个错误的 URL 因为它描述了 URL 中的操作 GET 这更像是一个惯例 而不是硬性规则 但
  • 现在有人可以下载 Eclipse 吗?

    我无法下载 Eclipse 这是Eclipse的问题吗 这是链接https www eclipse org downloads packages 是的 在计划内的维护中断之后 eclipse org 网站是很遗憾无法到达的到目前为止 202
  • 调用未定义的方法 Illuminate\Pagination\Paginator::make()?

    这是我的代码 use Illuminate Support Collection use Illuminate Support Facades Input use Illuminate Pagination Paginator collec
  • CakePHP - 分页和排序二级关联

    我知道这个问题已经被问了 100 000 次 但我几乎阅读了所有 100 000 条回复 但似乎没有一个符合我的要求 我已经尝试了所有可能的组合 显然没有 但我担心我会在如此相对简单的事情上失败 这是我的第二个蛋糕项目 所以我绝不是专家 简
  • 如何绘制混合箱线图:一半箱线图,另一半有抖动点?

    我正在尝试制作与图 2d f 类似的图文章发表在 自然 杂志上今年 它基本上是一半箱线图 另一半是点 有人能给我一些提示吗 非常感谢 这些是我的数据和代码 它们生成了带有点的完整框 require magrittr require tidy
  • android 媒体播放器显示音频但不显示视频

    我正在使用媒体播放器来播放视频 它只播放音频而不播放视频 有人可以帮忙吗 我的代码如下 public class VideoViewApplication extends Application Override public void o
  • WHERE-CASE 子句子查询性能

    该问题可能特定于 SQL Server 当我编写如下查询时 SELECT FROM IndustryData WHERE Date 20131231 AND ReportTypeID CASE WHEN fnQuarterDate 2013
  • XSLT :将命名空间声明添加到根元素

    我有这个 XML 文档
  • 更新 SQL Server 2012 中的 varbinary(MAX) 字段丢失最后 4 位

    最近想做一些数据修补 尝试更新一列 typevarbinary 最大 更新值是这样的 0xFFD8F 6DC0676 但是 更新查询成功运行后 该值变为 0x0FFD8 6DC067 看起来最后 4 位丢失了 或者整个值右移了一个字节 我尝
  • 如何通过脚本设置Azure DevOps版本的描述?

    在 Azure DevOps 中 我尝试通过 PowerShell CMD 设置版本描述 以便根据构建步骤中工件的输入获得版本的动态描述 我尝试通过 powershell 设置发布变量 例如 Write Host vso task setv
  • 如何让循环中的多个ajax请求按顺序返回值?

    我必须循环发出一系列 Ajax 请求 大约有100个 每个请求都会返回一个 JSONP 变量 我从 JSON 中提取数据并将值附加到 div 中 问题是我希望 div 按函数调用的顺序附加数据 即依次 现在 每次刷新页面时 我都会根据请求完
  • Dask Dataframe 将列表的列拆分为多列

    在 Pandas 中可以轻松完成相同的任务 import pandas as pd df pd DataFrame lists i i 1 for i in range 10 df left right pd DataFrame x for
  • 这个“标签”在 C++ 中意味着什么?

    我正在阅读一些 C 代码 我看到了一些有趣的东西 代码是这样的 repeat code here fallback code here start another code 这是我第一次在 C 代码中看到这种 标签 我称之为标签是因为我在汇
  • 没有显式锁定的 postgres 死锁

    我使用 PostgreSQL 9 2 并且我没有在任何地方使用显式锁定 也没有LOCK声明也不SELECT FOR UPDATE 然而 最近我得到了ERROR 40P01 deadlock detected 不过 检测到死锁的查询被包装在事
  • 如何通过ajax将表单数据发送到python脚本?

    我正在努力处理 python 程序和 ajax 请求 我正在尝试将一些数据从 Javascript 获取到 python 程序中 我一直在使用 getfirst field name 的正常方法不起作用 我认为这是因为请求是通过 ajax
  • 在离开未保存更改的网页之前警告用户

    我的申请中有一些带有表格的页面 如何保护表单 以便在有人离开或关闭浏览器选项卡时 系统应提示他们确认是否确实要保留未保存数据的表单 简短 错误的答案 你可以通过以下方式做到这一点处理beforeunload事件并返回一个非空字符串 wind
  • iOS:UITableView 滚动太快时会混合数据

    我已经对 UITableViewCell 进行了子类化以向其添加自定义外观 在 MYTableViewCell 的初始化级别 我添加了 4 个子视图 UIImageView 和三个 UILabel 所有 4 个子视图都分配有不同的标签 在
  • Google 表格的活跃用户 VS 有效用户

    我正在编写一个简单的谷歌应用程序脚本应用程序 它根据请求页面的用户执行一些数据操作 根据谷歌文档对象 Session 有获取活动用户 and 获取有效用户 我目前使用它来确定用户 看一下代码 var email Session getAct
  • 操作栏下的进度栏

    问题摘要 我怎样才能做一个ProgressBar集成在内部ActionBar 就像在 Chrome 应用程序上一样 Details 看一下 Chrome 的截图 我想创建一个像这样的操作栏 在操作栏的正下方 有一个进度条 它根据页面加载情况