Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 动作条下的进度条_Android_Android Actionbar_Android Progressbar - Fatal编程技术网

Android 动作条下的进度条

Android 动作条下的进度条,android,android-actionbar,android-progressbar,Android,Android Actionbar,Android Progressbar,问题摘要:如何在ActionBar中集成ProgressBar,就像在Chrome应用程序中一样 详细信息:查看Chrome的屏幕截图: 我想创建一个像这样的操作栏。就在操作栏下面,有一个进度栏,它根据页面加载情况进行填充。我在很多应用程序中都看到过这个例子,比如Feedly,但我还不能创建自己的实现。我尝试使用Android自己的API来创建它: @Override protected void onCreate(Bundle savedInstanceState) { //Requ

问题摘要:如何在
ActionBar
中集成
ProgressBar
,就像在Chrome应用程序中一样

详细信息:查看Chrome的屏幕截图:

我想创建一个像这样的操作栏。就在操作栏下面,有一个进度栏,它根据页面加载情况进行填充。我在很多应用程序中都看到过这个例子,比如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在动作栏上方显示,如下所示:


那么,如何使我的ProgressBar显示在操作栏下,就像在Chrome应用程序上一样?

扩展以下类中的活动,使每个类的顶部(操作栏下方)都有一个ProgressBar,并有一个
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):


好吧,我为我的一个宠物应用程序做了类似的事情,不确定这是唯一的方法还是最好的方法,但它确实有效

首先,使用覆盖操作栏,然后将背景可绘制设置为“null”,以便覆盖操作栏是透明的

现在在活动布局中,将根视图的上边距设置为“actionbar高度”,您可以这样做

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

现在,该操作不会隐藏任何活动内容

接下来要做的是在根视图的顶部添加一个与操作栏高度相同的标题视图。为其设置背景色。这将是您的操作栏的颜色,并且由于操作栏在该标题视图的顶部完全对齐


现在,您可以轻松地在标题视图中放置进度条,并将其与标题视图的底部对齐。对于用户来说,这看起来就像进度条在操作栏上一样,就像chrome一样

请使用下面的代码。只需在进度条中使用一种默认样式,如
style=“?android:attr/progressBarStyleHorizontal”


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

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

此实现的示例屏幕截图

代码 只需将此代码放入某个活动的
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参数将progressBar设置得更宽或更窄,但可能需要调整
-10
偏移量

造型 不幸的是,您可以看到进度条丑陋的灰色背景。要删除它,只需按id搜索背景并试图隐藏它是行不通的。要删除背景,我必须创建与系统版本相同的drawble并删除背景项

TL;DR:创建文件
progress\u horizontal\u holo\u no\u background\u 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>
额外:不确定进度条 KitKat之前版本的不确定进度条非常丑陋和滞后。 您可以下载名为
ButteryProgressBar
的新平滑进度条。只需在google上搜索它(我不能发布更多链接,因为我是新来的:[),将该类添加到您的项目中,您可以简单地用此代码替换以前的ProgressBar,并拥有crispy Undeterminate进度条:

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);
根据本守则:

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

希望我能提供帮助:)

我已经从这个线程以及StackOverflow上的其他线程编译了代码,并创建了一个项目,可以用来实现ButteryProgesBar以及“下拉刷新”

您可以在应用程序中随意使用这些代码


非常感谢你们。

这是一种可以通过使用获得的本地行为

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


可以在中找到一个简单的教程。

这个答案可能重复的问题:你找到解决方案了吗?我的grandmaIt作品的屏幕截图…在大多数情况下。ProgressBar看起来与actionbar是分开的。我不得不在ProgressBar中添加
android:layout\u marginTop=“-8dp”
,以模拟“影子"效果。但对于这种方法,将其添加到主布局本身可能更有效。但现在它可以按预期工作。感谢您的破解。@zubietaroberto是的,如果您仅将其用于一个活动,则可以将其添加到主布局中。如果您希望多个活动具有此功能,则可以扩展上面所示的类。这对于me,但进度条显示在tab host下,如何使其位于tab host上方和操作栏下方?从ViewTreeObserver类型中移除LobalOnlyOutliner(ViewTreeObserver.OnGlobalLayoutListener)的方法是deprecated@ArjunU.我们应该用什么来代替>@PatrickGeyer看,我已经测试了不确定的进度条(
ButteryProgressBar
)具有
ActionBarActivity
,但它不起作用。如何在
ActionBar/工具栏下放置不确定的进度条?
?这是我使用的布局:@GerritHoekstra:如果
getSupportActionBar().getHeight()
函数起作用,您就快到了。
progressBar.setY()
函数设置相对于屏幕顶部的位置,包括状态栏。因此您需要做的是
setY(supportActionBarHeight+Math.ceil(25*context.getResources().getDisplayMetrics().density))
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);
@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);
}