使用Android 5.0 SDK(API 21)时,setSupportProgressBarIndeterminateVisibility方法会引发java.lang.NullPointerException错误。

22

我的Activity类扩展了android.support.v7.app.ActionBarActivity。我在onCreate()方法中请求窗口功能并调用setSupportProgressBarIndeterminateVisibility(),如下所示:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.activity_main);
    setSupportProgressBarIndeterminateVisibility(true);
}

我无法理解我的代码存在什么问题,为什么会出现java.lang.NullPointerException错误,这是由于setSupportProgressBarIndeterminateVisibility()引起的。

我的gradle依赖项包括:

compile 'com.android.support:appcompat-v7:21.0.0'

有人知道如何在API 21中使用support.v7操作栏中的不确定进度条吗?

2个回答

32

你需要使用工具栏(Toolbar)而不是操作栏(ActionBar),并将进度条添加到工具栏中。

下面是一种简单的方法,将不确定的进度条(ProgressBar)插入到工具栏中;事实证明这并不难 :) 只需像这样在工具栏中放置进度条 xml 元素即可:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary">

    <ProgressBar
        android:id="@+id/progress_spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:indeterminate="true"
        android:visibility="gone" />

</android.support.v7.widget.Toolbar>

然后在您的AppCompatActivity中,仅在检索到Toolbar之后检索ProgressBar,并在需要时将ProgressBar设置为可见或不可见。

protected void onCreate(Bundle savedInstanceState) 
{
    setContentView(R.layout.toolbar);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);

    progressBar = (ProgressBar) findViewById(R.id.progress_spinner);

    //Make progress bar appear when you need it
    progressBar.setVisibility(View.VISIBLE);

    //Make progress bar disappear
    progressBar.setVisibility(View.INVISIBLE);
}

希望这能帮到您 :)

编辑:根据最新的Android支持库指南,将ActionBarActivity替换为AppCompatActivity。


非常好的回答!或许与此无关,我有与你上面相同的布局代码(也许是从你之前的回答中得到的),但在运行Android 4.4.2的Galaxy S5上,“visibility=gone”被忽略了。我必须通过id编程方式查找ProgressBar视图并将其可见性设置为View.GONE。你认为这是某种appcompat问题吗? - swooby
@swooby 我的Galaxy S5运行着5.0系统,使用最新的支持库appcompat-v7:22.2,visibility=gone可以正常工作。也许这是一个特定的旧版本appcompat或4.4.2特定的bug。不过,如果你不需要在工具栏上使用其他东西,你也可以使用"visibility=invisible"。 :) - ABVincita
1
XML代码应该改进,加上android:layout_gravity="end" - drindt
有人使用SearchView解决方案时遇到过问题吗? 问题在于,如果您展开SearchView,然后将其折叠,支持库会自动显示工具栏。 - lujop
我正在尝试使用API 26,但是ProgressBar的android:layout_gravity="end"似乎不存在。结果是在工具栏中间出现了一个进度条。 - amitavk

21
根据 Chris Banes(AppCompat 的作者)在他的 AppCompat v21 公告帖子中此评论

无论如何,进度条不再支持在工具栏上显示了。

原因是:

因为工具栏是一个高度专注的小部件。如果需要进度条,请自己将其添加到工具栏(它只是一个 ViewGroup)。

随着官方文档的更新,我期待会有更多信息提供。


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