22

我的活动类扩展了android.support.v7.app.ActionBarActivity。我请求窗口功能,并在onCreate()方法调用setSupportProgressBarIndeterminateVisibility()如下:setSupportProgressBarIndeterminateVisibility raise与Android 5.0 SDK(API 21)一起使用时发生java.lang.NullPointerException

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

我不能把握什么是错我的代码,为什么我收到java.lang.NullPointerExceptionsetSupportProgressBarIndeterminateVisibility()提高。

我gradle这个依赖性包含:

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

是否有人知道如何使用API​​ 21使用不确定的进度栏在support.v7行动吧?

回答

21

this comment克里斯·巴内斯(程序兼容性的作者)程序兼容性V21公布后:

无论哪种方式,进度条的不支持工具栏了。

为什么:

因为工具栏是一个高度集中的小部件。如果你想要一个ProgressBar,你可以自己将它添加到工具栏(它只是一个ViewGroup)。

我希望更多的信息,因为官方文档很快就会在这里更新。

32

您需要使用工具栏而不是ActionBar并将ProgressBar添加到工具栏中。

这是一个简单的解决方案,将不确定的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,简单地检索工具栏后取回进度,并设置进度可见或在需要时隐形。

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

希望这有助于:)

编辑:更换ActionBarActivity与AppCompatActivity按照最新的Android支持库的准则。

+0

优秀的答案!在一个可能不相关的说明中,我有与上面完全相同的布局代码(也许我从之前的答案中得到了它),但在运行4.4.2的Galaxy S5上忽略了“visibility = gone”。我必须以编程方式通过id找到ProgressBar视图并将其可见性设置为View.GONE。你认为这是某种appcompat问题吗? – swooby 2015-06-04 22:45:28

+0

@swooby我有Galaxy S5运行5.0和可见性=消失的工作就好了(使用最新的支持库appcompat-v7:22.2。)。也许这是一个特定的旧appcompat或4.4.2特定的错误。不过,如果您不需要使用工具栏空间作为其他东西,也可以使用“可见性=不可见”。 – ABVincita 2015-07-10 05:04:12

+1

xml代码应该改进为: 'android:layout_gravity =“end”'。 – drindt 2015-08-01 10:47:09

相关问题