appcompat显示操作栏中的进度导致NPE

时间:2014-10-18 19:06:40

标签: android

将我的SDK更新到所有最新的Android 5.0好东西之后,我无法在appcompat中使用ActionBar中内置的进度条。我已经完成了所有常用的修复(在setContent()之前和oncreate中的超级调用之前调用supportRequestWindowFeature(),但没有任何效果。这就是我正在做的事情:

public class LoginActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
    supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    super.onCreate(savedInstanceState);

    setContentView(R.layout.login);
    ...
    loginButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
                ...
                setSupportProgressBarIndeterminateVisibility(true);
        }
    });

} 和堆栈跟踪:

10-18 19:38:21.053: E/AndroidRuntime(11206): java.lang.NullPointerException: Attempt to invoke     virtual method 'void android.support.v7.internal.widget.ProgressBarCompat.setVisibility(int)' on a null object reference
10-18 19:38:21.053: E/AndroidRuntime(11206):    at android.support.v7.app.ActionBarActivityDelegateBase.updateProgressBars(ActionBarActivityDelegateBase.java:786)
10-18 19:38:21.053: E/AndroidRuntime(11206):    at android.support.v7.app.ActionBarActivityDelegateBase.setSupportProgressBarIndeterminateVisibility(ActionBarActivityDelegateBase.java:692)
10-18 19:38:21.053: E/AndroidRuntime(11206):    at android.support.v7.app.ActionBarActivity.setSupportProgressBarIndeterminateVisibility(ActionBarActivity.java:327)
10-18 19:38:21.053: E/AndroidRuntime(11206):    at com.myapppackage.LoginActivity$2.onClick(LoginActivity.java:82)

这是在运行Android 4.4.4的Nexus 5上。应用主题继承自Theme.AppCompat。该应用程序使用Android 5.0构建,targetSDK为21.当我将setSupportProgress用于普通的水平进度条时,同样的事情发生。任何帮助非常感谢。

编辑: 发现了问题。在android.support.v7.internal.widget.ToolbarWidgetWrapper中:

@Override
public void initIndeterminateProgress() {
    Log.i(TAG, "Progress display unsupported");
}

也许不是错误而是功能?工具栏似乎是新的ActionBars。

我在另一台计算机上有一份V20 appcompat的副本,所以我回过头来看。

4 个答案:

答案 0 :(得分:12)

可能的解决方法是手动将ProgressBar添加为自定义视图并覆盖 setSupportProgressBarIndeterminateVisibility

on onCreate:

ProgressBar progressBar = new ProgressBar(this);
progressBar.setVisibility(View.GONE);
progressBar.setIndeterminate(true);
getSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setCustomView(progressBar);

在您的活动中:

@Override
public void setSupportProgressBarIndeterminateVisibility(boolean visible) {
    getSupportActionBar().getCustomView().setVisibility(visible ? View.VISIBLE : View.GONE);
}

当然,切换到工具栏并添加ProgressBar应该会有更多面向未来的。

答案 1 :(得分:4)

支持库V21不支持不确定的进度和水平进度条。来自android.support.v7.internal.widget.ToolbarWidgetWrapper:

@Override
public void initIndeterminateProgress() {
    Log.i(TAG, "Progress display unsupported");
}

Chris Banes证实了这一点:http://chris.banes.me/2014/10/17/appcompat-v21/#comment-1642002459。我正在使用appcompat v20的旧版本。以下是需要它的人的拉链: https://drive.google.com/file/d/0B2dSjU9N8KdZUEFuMkhLZzJZOFU/view?usp=sharing

答案 2 :(得分:2)

编辑:以下内容不起作用,因为ProgressBarCompat是一个隐藏类,无法添加到您的XML布局中。感觉就像是appcompat库中的一个bug。


正在寻找ActionBarActivityDelegateBase.java中的进度条:

private ProgressBarCompat getCircularProgressBar() {
    ProgressBarCompat pb = (ProgressBarCompat) mActivity.findViewById(R.id.progress_circular);
    if (pb != null) {
        pb.setVisibility(View.INVISIBLE);
    }
    return pb;
}

在同一个类的updateProgressBars()方法中使用它。看起来开发人员需要为您的活动添加ProgressBarCompat

答案 3 :(得分:2)

对于其他正在升级其应用程序/库的人 - 他们已经放弃了对appsupport v7库中进度条的支持。 https://code.google.com/p/android/issues/detail?id=78310