在我的\drawable-mdpi
文件夹中,我有一个名为test.jpg
在我的main.xml
文件中,在我的LinearLayout部分中,我有:
<ImageView
android:id="@+id/test_image"
android:src="@drawable/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
在我的src文件夹中,我只有一个文件,HelloAndroidActivity.java
只有以下方法:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView image = new ImageView(this);
image = (ImageView) findViewById(R.id.test_image);
setContentView(image);
}
这似乎是正确的,但每当我尝试运行它时,我得到应用程序HelloAndroid(进程xxxxx)意外停止。请再试一次。
奇怪的是它之前显示的是图像,但现在它不会,我不知道为什么。
此外,当我注释掉ImageDisplay代码时,将其替换为TextDisplay代码。即。
TextView tv = new TextView(this);
tv.setText("Does this work?");
setContentView(tv);
它会显示文字。
编辑:被要求发布logcat。 Link to pastebin
答案 0 :(得分:3)
这听起来很刺耳,但是当我从你的手中取出刀并说你应该多做一些阅读或其他什么的时候:
setContentView(R.layout.main);
ImageView image = new ImageView(this);
image = (ImageView) findViewById(R.id.test_image);
setContentView(image);
您已将内容视图设置为xml布局。这很酷。然后在代码中创建一个新的ImageView实例,这可以,但可能刚刚超过你的技能水平。
然后,您使用从原始setContentView调用中为您充气的布局中提取的ImageView覆盖您刚刚创建的ImageView。这毫无意义。就这样做。
setContentView(R.layout.main);
ImageView image = (ImageView) findViewById(R.id.test_image);
最后,使用从当前Activity的内容视图中提取的图像引用覆盖整个Activity的内容视图。不要这样做。这没有道理。我的猜测是您的异常要么是重置内容视图,要么是您尝试使用另一个视图中已存在的视图设置内容视图。
您是否尝试动态设置显示的图像?如果没有,如果您只是想“显示”图像,请执行此操作。
setContentView(R.layout.main);
就是这样。
答案 1 :(得分:1)
setContentView
和findViewById
不按照您的想法行事。
setContentView
将给定视图设置为您活动的顶级根视图。通常将其设置为定义许多嵌套视图层次结构的布局。如果为其提供布局资源,则该布局将膨胀为新视图。如果您为其提供现有视图,则将使用该现有视图实例。
Activity#findViewById
在您的活动窗口的当前视图层次结构中执行树搜索,从根开始。如果它可以在给定id的层次结构中找到某个视图,则返回该视图。如果找不到,则该函数返回null。
因此,考虑到这些事情,让我们逐步完成您的代码:
setContentView(R.layout.main);
- 对您的主要布局进行充气,并将其设置为您的活动内容。到目前为止看起来不错。
ImageView image = new ImageView(this);
- 创建一个新的ImageView。没有什么技术上的错误,但可能不是你想要的,因为......
image = (ImageView) findViewById(R.id.test_image);
- 搜索具有id test_image的View的当前视图层次结构(上面为R.layout.main充气的层次结构)。这会覆盖您的image
变量,将您在上面一行创建的new ImageView
丢弃为垃圾回收。
setContentView(image);
- 尝试将id为test_image的视图设置为活动视图层次结构的根,覆盖在第一个setContentView调用中膨胀的层次结构。我猜测如果你检查异常中的堆栈跟踪,你的应用程序就会崩溃,因为此时image
已经有了一个父视图,而你试图给它一个新的视图,而不是将它从当前删除父母第一。
将视图附加到层次结构后,您无需在内容更改时重新添加该视图。如果您想要这样做,只需就地更改内容。不止一次调用setContentView
是一件非常不寻常的事情。在绝大多数情况下,这是不必要的。
由于您的主要布局已经在ImageView中指定了您想要的可绘制内容,因此您可以将onCreate
缩短为前两行,以便只显示图像:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.id.main);
}