应用Android样式时的Robolectric RuntimeException - ShadowAssetManager.buildAttribute

时间:2017-03-06 22:15:05

标签: android android-styles robolectric android-progressbar

我正在尝试在Robolectric中构建一个Activity,但由于未能使活动的XML膨胀而失败。我在下面列出了有问题的组件。我还没能在网上找到满意的答案。

我尝试过创建自定义Shadow类,但这不起作用(https://github.com/robolectric/robolectric/issues/2155#issuecomment-283890626)。

这似乎是使用Android属性的任何人遇到的基本问题,所以我不确定这里出了什么问题。

    mActivity = Robolectric.buildActivity(TestActivity.class)
            .withIntent(intent)
            .create()
            .get();

以下是包含违规属性样式的XML

<ProgressBar
    android:id="@+id/blocking_progress_bar"
    style="?android:attr/indeterminateProgressStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:indeterminate="true"
    android:interpolator="@android:interpolator/cycle" />

下面是堆栈跟踪。

Caused by: java.lang.RuntimeException: no value for android:attr/indeterminateProgressStyle in theme with applied styles: [Style android:Theme_DeviceDefault (and parents) (forced), Style com.package.name:Theme_XXX (and parents) (forced)]
    at org.robolectric.shadows.ShadowAssetManager.buildAttribute(ShadowAssetManager.java:463)
    at org.robolectric.shadows.ShadowAssetManager.attrsToTypedArray(ShadowAssetManager.java:532)
    at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:213)
    at android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java)
    at android.content.Context.obtainStyledAttributes(Context.java:532)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)

修改

以下是我的问题的解决方案,虽然我仍然觉得这是一个Robolectric错误。

从style =“?android:attr / indeterminateProgressStyle”更改为style =“@ android:style / Widget.ProgressBar.Small”修复了问题。

Robolectric Issue with ProgressBar

1 个答案:

答案 0 :(得分:0)

我找到了获取异常java.lang.RuntimeException: no value for android:attr/indeterminateProgressStyle in theme with applied styles的解决方法。下面显示的代码也适用于其他无法膨胀的视图,因为在使用应用样式的主题中找不到任何值。

步骤1)创建一个ShadowThemeorg.robolectric.shadows.ShadowResources.ShadowTheme,如下所示:

import android.content.res.Resources;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowResources;

@Implements(value = Resources.Theme.class)
public class ShadowTheme extends ShadowResources.ShadowTheme {


@Implementation
@Override
public TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) {
    try {
        return super.obtainStyledAttributes(set, attrs, defStyleAttr, defStyleRes);
    } catch (Throwable err) {
        AttributeSet attributeSet = Robolectric.buildAttributeSet()
                .addAttribute(android.R.attr.layout_width, "0dp")
                .addAttribute(android.R.attr.layout_height, "0dp")
                .build();
        return super.obtainStyledAttributes(attributeSet, attrs, defStyleAttr, defStyleRes);
    }
}
}

步骤2:向@RunWith阴影注释值添加阴影,如下所示:

import android.os.Build;
import com.superbalist.android.BuildConfig;
import com.superbalist.android.test.shadow.ShadowTheme;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class,
    sdk = Build.VERSION_CODES.N_MR1,
    shadows = {ShadowTheme.class})
public class MyUnitTest {

}