在操作栏进度(ProgressBar under Action Bar)

2019-07-05 16:00发布

问题总结:我怎样才能让一个ProgressBar整合内部ActionBar ,就像在Chrome应用?

详细信息:看看Chrome的这个截图:

我想创建一个操作栏就是这样的。 刚下行动吧,还有,根据页面加载填补了进度。 我见过许多应用程式,例如资讯提供ly这个例子,但我一直没能创造我自己的实现。 我试图使用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);
}

但这个代码只导致进度显示操作栏,如下所示:

所以,我怎样才能使我的进度条显示下行动吧,就像在Chrome应用?

Answer 1:

现在,这是可以使用获得本地行为SwipeRefreshLayout 。

您可以使用您的包裹滚动视图SwipeRefreshLayout ,然后你只需要听onRefresh事件:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
    swipeLayout.setOnRefreshListener(this);
    swipeLayout.setColorScheme(android.R.color.holo_blue_bright, 
            android.R.color.holo_green_light, 
            android.R.color.holo_orange_light, 
            android.R.color.holo_red_light);
}


@Override public void onRefresh() {
    new Handler().postDelayed(new Runnable() {
        @Override public void run() {
            swipeLayout.setRefreshing(false);
        }
    }, 5000);
}

一个很好的和简单的教程中可以找到这个博客 。



Answer 2:

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

他们用我认为关键是,他们在检索称为视图层次结构的顶视图DecorView ,并在那里加入了进度条。 这样,进度条同时显示在操作栏和内容区域。 需要注意的是,SD的回答提出的进度条到内容区和“偷”空间,从实际的内容,有什么可以导致意想不到的结果。

这种实现的示例截图

只是把这个代码转换成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'高度参数设定进度宽或窄游戏,但您可能需要调整-10偏移。

造型

不幸的是,你可以看到进度条丑陋的灰色背景。 要删除它,只需搜索由ID背景和试图掩盖它不工作。 要删除的背景下,我不得不创建的系统版本相同drawble和删除背景的项目。

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>

从复制适当的巴纽可绘制sdk/platforms/android-xx/data/res/drawable-xxx/你的项目,然后在代码中可以添加:

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

附加:不确定的进度栏

的不确定进度条预奇巧版本是很丑陋和laggy。 您可以下载新的平滑进度称为ButteryProgressBar 。 只要搜索它的谷歌(我不能发表任何更多的联系,因为我是新来的:),添加类到你的项目,你可以简单地使用此代码替换以前的进度,并有松脆不确定的进度条:

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

希望我帮助:)



Answer 3:

从下面的类在顶部的每一个(下面的ActionBar)有一个进度延伸活动,和一个getProgressBar()方法:

父类:

public abstract class ProgressActivity extends Activity {
    private ProgressBar mProgressBar;

    @Override
    public void setContentView(View view) {
        init().addView(view);
    }

    @Override
    public void setContentView(int layoutResID) {
        getLayoutInflater().inflate(layoutResID,init(),true);
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        init().addView(view,params);
    }

    private ViewGroup init(){
        super.setContentView(R.layout.progress);
        mProgressBar = (ProgressBar) findViewById(R.id.activity_bar);
        return (ViewGroup) findViewById(R.id.activity_frame);
    }

    protected ProgressBar getProgressBar(){
        return mProgressBar;
    }
}

布局(progress.xml):

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"
    android:layout_width="match_parent" android:layout_height="match_parent">
<ProgressBar android:id="@+id/activity_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="-8dp"
    style="@android:style/Widget.DeviceDefault.ProgressBar.Horizontal"
    />
  <FrameLayout android:id="@+id/activity_frame"
      android:layout_width="match_parent"
      android:layout_height="fill_parent"
      />
</LinearLayout>


Answer 4:

我编了本主题中的代码以及其他线程在计算器上并创建了可用于实现ButteryProgessbar以及“下拉刷新”的项目。 https://github.com/pauldmps/Gmail-like-Pull-Down-to-Refresh

随意使用的代码在你的应用程序。

非常感谢你们。



Answer 5:

请使用下面的代码。 只需使用一个默认的样式在进度条style="?android:attr/progressBarStyleHorizontal"

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    <ProgressBar 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal"
        android:indeterminate="true"

        />

</RelativeLayout>


Answer 6:

好吧,我做了我的宠物的应用程序之一类似的东西,我不知道这是唯一的办法还是做它最好的方式,但它肯定工程。

首先,使用覆盖操作栏,然后设置背景绘制为“空”,使覆盖操作栏是透明的。

现在,在你活动布局,为您的根视图“动作条高度”你可以做这样的设置上边距。

<RelativeLayout
    ...
    android:layout_marginTop="?android:attr/actionBarSize" />

现在的动作是不会隐藏任何您的活动内容。

你现在要做的下一件事就是 - 增加与高度相同操作栏根视图顶部的标题视图。 设置背景颜色给它。 现在,这将是你的动作条的颜色,因为操作栏上的顶级PF完全对齐这个头视图。

现在你可以很容易地把一个进度条在头视图并使其与标题视图的底部。 对于用户,这会看,如果进度条是在操作栏本身,就像镀铬..



文章来源: ProgressBar under Action Bar