Android 的 RelativeLayout 单元测试设置

Posted

技术标签:

【中文标题】Android 的 RelativeLayout 单元测试设置【英文标题】:Android's RelativeLayout Unit Test setup 【发布时间】:2011-01-29 17:21:45 【问题描述】:

我正在尝试为我的 android 的 RelativeLayout 编写单元测试。目前,我的测试代码设置如下:

public class SampleRelativeLayoutTest extends AndroidTestCase 

private ViewGroup testView;

private ImageView icon;
private TextView  title;


@Override
protected void setUp() throws Exception 
    super.setUp();
    // inflate the layout
    final Context context = getContext();
    final LayoutInflater inflater = LayoutInflater.from(context);
    testView = (ViewGroup) inflater.inflate(R.layout.sample_layout,
            null);
    // manually measure and layout
    testView.measure(500, 500);
    testView.layout(0, 0, 500, 500);
    // init variables
    icon = (ImageView) testView.findViewById(R.id.icon);
    title = (TextView) testView.findViewById(R.id.title);

但是,我遇到了带有以下堆栈跟踪的 NullPointerException

java.lang.NullPointerException
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:427)
at android.view.View.measure(View.java:7964)
at com.dqminh.test.view.SampleRelativeLayoutTest.setUp(SampleRelativeLayoutTest.java:33)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)

我应该在我的 setUp() 代码中进行哪些更改以使测试正常运行?

【问题讨论】:

这对我来说就像一个魅力:***.com/a/6086510/1293704 【参考方案1】:

我有一份 Android 源代码的副本,但不确定它是否与您正在使用的相同(或者对于这门课可能没关系)。异常是 onMeasure 方法内 RelativeLayout 第 427 行的 NullPointerException。我拥有的版本中的那一行是 onMeasure 方法中 mLayoutParams 实例变量的第一次访问。您是否可能忘记在您的 xml 布局或类似的东西中添加 layout_width 和 layout_height 参数?

【讨论】:

谢谢,确实我错过了布局参数。添加后:testView.setLayoutParams(new LayoutParams(500,500));代码运行正常:-)【参考方案2】:

如果您将RelativeLayout 包装在LinearLayout 中,也可以使用。并改为传递 Linearlayout。

【讨论】:

【参考方案3】:

我会这样做的:

LayoutParams layoutParams = new LayoutParams(500,500);
testView.setLayoutParams(layoutParams);
testView.layout(0, 0, 500, 500);

【讨论】:

【参考方案4】:

另一个可能的原因是:RelativeLayout 的大小与其子元素的位置之间存在循环依赖关系。例如,您有一个RelativeLayout,其高度设置为WRAP_CONTENT,一个子级设置为ALIGN_PARENT_BOTTOM

下面是RelativeLayout的注解:

可以在其中描述子项位置的布局 与彼此或与父母的关系。为了效率, 视图之间的关系是一次性评估的,所以如果视图 Y 是 取决于视图 X 的位置,确保视图 X 先出现 在布局中。

请注意,RelativeLayout 的大小与其子项的位置之间不能存在循环依赖关系。例如,您不能有一个高度设置为WRAP_CONTENTRelativeLayout 和一个设置为ALIGN_PARENT_BOTTOM 的子级。

有关布局属性,另请参阅RelativeLayout.LayoutParams

【讨论】:

以上是关于Android 的 RelativeLayout 单元测试设置的主要内容,如果未能解决你的问题,请参考以下文章

Android布局之相对布局——RelativeLayout

Android笔记:RelativeLayout

Android相对布局(RelativeLayout)最全解析

Android基础篇 RelativeLayout.LayoutParams

Android的RelativeLayout似乎坏了

Android中RelativeLayout各个属性的含义