在Android中以编程方式居中显示进度条

16

我正在尝试使用以下代码以编程方式居中一个 ProgressBar

ViewGroup layout = (ViewGroup) findViewById(android.R.id.content).getRootView();
progressBar = newProgressBar(SignInActivity.this,null,android.R.attr.progressBarStyleLarge);
progressBar.setIndeterminate(true);
progressBar.setVisibility(View.VISIBLE);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100,100);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.addView(progressBar,params);

尺寸设置似乎正常,但是ProgressBar在现有布局(由相对布局定义为xml)中没有居中。这里明显有什么问题吗?

XML如下:

<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"
tools:context=".test"
android:typeface="monospace">

</RelativeLayout>

即它只是一个空的相对布局,用于测试并查看是否可以通过编程方式添加进度条。

谢谢。


请发布XML :) - An SO User
1
为什么要花时间编程来实现某些功能,而不是直接在xml中实现呢? - VenomVendor
我将其创建为一个类,因为它是一个视图,我希望在应用程序中不同的进程进行时动态注入。以这种方式进行可以避免我放置所有的布局。我只需将其实例化为一个对象并将其附加到当前布局即可。 - James B
4个回答

36

我根据@DharmarajRupakheti的答案编写了一个类:

public class ProgressBarHandler {
    private ProgressBar mProgressBar;
    private Context mContext;

    public ProgressBarHandler(Context context) {
        mContext = context;

        ViewGroup layout = (ViewGroup) ((Activity) context).findViewById(android.R.id.content).getRootView();

        mProgressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleLarge);
        mProgressBar.setIndeterminate(true);

        RelativeLayout.LayoutParams params = new
                RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);

        RelativeLayout rl = new RelativeLayout(context);

        rl.setGravity(Gravity.CENTER);
        rl.addView(mProgressBar);

        layout.addView(rl, params);

        hide();
    }

    public void show() {
        mProgressBar.setVisibility(View.VISIBLE);
    }

    public void hide() {
        mProgressBar.setVisibility(View.INVISIBLE);
    }
}

用法:

mProgressBarHandler = new ProgressBarHandler(this); // In onCreate
mProgressBarHandler.show(); // To show the progress bar
mProgressBarHandler.hide(); // To hide the progress bar

1
考虑到工具栏中的进度条已被弃用,这应该是正确的做法。 - Daniel
感谢您的回答,这是一种很好的动态实现进度条的方式。 - Rajan Maurya
1
我认为这会泄漏上下文对象。你需要将其转换为WeakReference - 或者,既然你甚至在第一个方法之外都没有使用它,干脆不要存储对它的引用。 - kpsharp
你好nima,这个解决方案已经测试过了吗?它会抛出任何异常吗? - kgandroid
是的,我在我的应用中使用过它,但那是5年前的事了,也许需要更新。 - nima
我一直在尝试通过警告对话框显示进度条,但是我遇到了一些问题,你能否请查看我的问题 - Faisal Qayyum

31

如果您想以程序方式完成它,可以按以下方式执行:

RelativeLayout layout = new RelativeLayout(this);
progressBar = new ProgressBar(SignInActivity.this,null,android.R.attr.progressBarStyleLarge);
progressBar.setIndeterminate(true);
progressBar.setVisibility(View.VISIBLE);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100,100);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.addView(progressBar,params);

setContentView(layout);

谢谢!我现在开始慢慢理解这个Android业务了。 - James B
实际上,您的实现问题在于您在ProgressBar中使用RelativeLayout参数,但外部父布局根本不是RelativeLayout。您应该将进度条放置在相对布局中,以使CENTER_IN_PARENT起作用。否则它将被忽略。 - tasomaniac
这对于新布局来说很好用,但如果我想将进度条附加到在xml中定义的现有布局中怎么办?上面的代码只显示进度条,也就是说它是一个新布局。谢谢。 - James B
如果我是你,我不会在程序中使用它。将进度条添加到您的布局中,并使用android:visibility="gone",当您想要显示它时,使用setVisibility(View.VISIBLE)进行编程。 - tasomaniac
不,确实您有一个RelativeLayout,但是您将progressBar添加到主内容视图而不是该RelativeLayout中。您可以为该RelativeLayout指定ID。然后通过调用findViewById()获取它,最后将progressBar添加到其中即可。 - tasomaniac
显示剩余3条评论

10

使用这种编码风格,可以得到您想要的结果。

ViewGroup layout = (ViewGroup) findViewById(android.R.id.content).getRootView();

progressBar = new ProgressBar(thisActivity,null,android.R.attr.progressBarStyleLarge);
progressBar.setIndeterminate(true);
progressBar.setVisibility(View.VISIBLE);

RelativeLayout.LayoutParams params = new 
        RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT);

RelativeLayout rl = new RelativeLayout(thisActivity);

rl.setGravity(Gravity.CENTER);
rl.addView(progressBar);

layout.addView(rl,params);

我一直在尝试通过警告对话框显示进度条,但是我遇到了一些问题,你能否请检查我的问题 - Faisal Qayyum

-1

你不需要使用XML。你可以通过代码来创建视图:

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout layout = new LinearLayout(this);
        ProgressBar pb = new ProgressBar(this, null,
                                         android.R.attr.progressBarStyleLarge);
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
        pb.setLayoutParams(params);
        layout.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);
        layout.addView(pb);
        setContentView(layout);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接