问题摘要:如何在ProgressBar
内集成ActionBar
,就像在Chrome应用上一样?
详细信息:查看Chrome中的此屏幕截图:
我想像这样创建一个Action Bar。在Action Bar的下方,有一个ProgressBar根据页面加载填充。我从很多应用程序中看过这个例子,比如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应用程序上一样?
答案 0 :(得分:56)
我对上面接受的答案并不完全满意,所以我自己做了一些额外的研究。
我相信他们使用的技巧是他们检索了名为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_horizontal_holo_no_background_light.xml
并粘贴此drawable:
<?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 drawables从sdk/platforms/android-xx/data/res/drawable-xxx/
复制到您的项目中,然后复制到您可以添加的代码中:
progressBar.setProgressDrawable(getResources().getDrawable(R.drawable.progress_horizontal_holo_no_background_light));
不确定进度条的Pre-KitKat版本相当丑陋和滞后。
您可以下载名为ButteryProgressBar
的新的smooth progressBar。只是在谷歌搜索它(我不能发布任何更多的链接,因为我是新来的:[],将类添加到您的项目中,您只需用此代码替换以前的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);
希望我帮助过:)
答案 1 :(得分:25)
从以下类扩展活动,在每个类的顶部(ActionBar下方)和getProgressBar()
方法中包含ProgressBar:
家长班:
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>
答案 2 :(得分:7)
现在可以使用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);
}
可以在this blog中找到一个简单易懂的教程。
答案 3 :(得分:4)
我已经从这个线程以及StackOverflow上的其他线程编译了代码,并创建了一个项目,可用于实现ButteryProgessbar以及&#34;下拉刷新&#34;。 https://github.com/pauldmps/Gmail-like-Pull-Down-to-Refresh
随意使用您应用程序中的代码。
非常感谢你们。
答案 4 :(得分:2)
请使用以下代码。只需在进度条中使用一个默认样式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>
答案 5 :(得分:0)
好吧,我为我的一个宠物应用程序做了类似的事情,我不确定这是唯一的方法还是最好的方法,但它绝对有效。
首先,使用叠加操作栏,然后将背景drawable设置为“null”,以使叠加操作栏透明。
现在,在您的活动布局中,将根视图的上边距设置为“操作栏高度”您可以这样做。
<RelativeLayout
...
android:layout_marginTop="?android:attr/actionBarSize" />
现在,该操作不会隐藏您的任何活动内容。
您现在要做的下一件事是 - 在根视图顶部添加标题视图,其高度与操作栏相同。设置背景颜色。现在这将是操作栏的颜色,因为操作栏在此标题视图的顶部完美对齐。
现在,您可以轻松地在标题视图中放置一个进度条,并将其与标题视图的底部对齐。对于用户来说,这看起来好像进度条在操作栏本身上,就像chrome ..