【问题标题】:Centering ProgressBar Programmatically in Android在 Android 中以编程方式居中 ProgressBar
【发布时间】:2013-08-18 18:11:00
【问题描述】:

我正在尝试使用以下代码以编程方式将 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 :)
  • 当您可以在 xml 中实现时,您为什么要努力以编程方式创建?
  • 我将它创建为一个类,因为它是我想在应用程序中发生不同进程时动态注入的视图。这样做意味着我不必放入所有布局。我可以将它实例化为一个对象并将其附加到当前布局中。

标签: android android-progressbar


【解决方案1】:

我根据@DharmarajRupakheti 的answer写了一个类:

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

【讨论】:

  • 考虑到 Toolbar 中的 progressBar 已被弃用,这应该是正确的做法
  • 感谢您的回答,动态实现 ProgressBar 的好方法
  • 我相信这会泄露 Context 对象。您需要将其设为 WeakReference - 或者,因为您甚至没有在第一种方法之外使用它,所以根本不存储对它的引用。
  • 嗨尼玛,这个解决方案是经过测试的吗?它会抛出任何异常吗?
  • 是的,我在我的应用程序中使用过它,但它是 5 年前的,可能需要更新。
【解决方案2】:

如果您想以编程方式执行此操作,可以如下所示:

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 业务。
  • 实际上,您的实施问题是您在 ProgressBar 中使用了 RelativeLayout 参数,但外部父布局根本不是 RelativeLayout。您应该将进度条放在相对布局中,以便 CENTER_IN_PARENT 工作。否则它将被忽略。
  • 这对新布局非常有效,但是如果我想将进度条附加到 xml 中定义的现有布局怎么办。上面只显示了进度条,即它是一个新的布局。谢谢。
  • 如果我是你,我不会以编程方式使用它。将进度条添加到您的布局并使用 android:visibility="gone" ,当您想显示它时,以编程方式使用 setVisibility(View.VISIBLE)。
  • 这就是我到目前为止一直在做的事情,但我非常喜欢不必将其放入所有布局中的想法(并不是说这是一个特别大的问题)。快速提问:您说外部父级不在相对布局中?我很困惑,因为在 xml 文件中没有这样定义(请参阅原始问题帖子)。
【解决方案3】:

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

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

【讨论】:

  • 我一直在尝试通过更改对话框显示进度条,但我遇到了一些问题,您可以查看我的question吗?
【解决方案4】:

您不需要 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2016-04-09
    • 2014-01-09
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多