在XML布局中的ImageView如何引用PNG文件?应该将PNG文件放在哪里?

5

在阅读了两本关于Android编程的书之后,我正在尝试移植一个iOS单词游戏应用程序:

word game screenshot

我想要有两个继承自View的类 - SmallTile.javaBigTile.java

这两个类都应该由一个ImageView(id: "image")和两个组成(id: "letter"和"value")。

它们之间的区别在于,BigTile是可拖动的,其“image”带有阴影。

我已经把图形资源放到目录res/drawable-mdpi中,并试图从布局文件res/layout/small_tile.xmlres/layout/big_tile.xml中引用它们,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/small_tile.png" >
</ImageView>

但是我遇到了错误:

找不到与给定名称匹配的资源(在“src”中的值为“@ drawable / small_tile.png”)

正如您在Eclipse屏幕截图中所看到的(在此处全屏):

eclipse screenshot

我尝试过其他路径用于我的资产,例如res/drawablessrc/assets

还有另一个问题:如何从View加载布局文件?

res/layout/small_tile.xml中只有一个ImageView,但我也想添加两个TextView(用于字母及其数字值),然后从SmallTile.java中加载它们。

从编程书籍中我知道如何从ActivityFragment加载布局 - 在onCreate中调用setContentView(R.layout.activity_main);,但是在View类中要调用什么以及何时调用呢?


看起来你的其他布局文件中还存在其他错误,请修复它们以便正确生成资源。 - tyczj
不,当我从small_tile.xml和big_tile.xml中删除ImageView的“src”属性时,一切都可以在模拟器中编译和运行。我的应用程序在GitHub上 - 您可以自己查看:https://github.com/afarber/android-newbie/tree/master/DragAndDraw - Alexander Farber
看起来你的代码在寻找资源时出了问题。可能是清理问题,或者你的布局/XML文件中有问题,或者你的某个资源名称中含有非法字符? - Gil Moshayof
我已经再次重命名了PNG文件,以确保它们的名称中只有拉丁字母。我在Eclipse中多次执行了“刷新”和“清理项目”,并重新启动了Eclipse。 - Alexander Farber
1个回答

7

在引用Drawable时,只需通过文件名来引用它们。应省略扩展名。

例如,您发布的ImageView在XML中应如下所示:

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/small_tile" >

请注意从android:src="@drawable/small_tile.png" 更改为 android:src="@drawable/small_tile" 要使用自定义布局与您的视图,请创建LayoutInflater,并调用inflate(R.id.my_layout, this);。例如:
public SmallTile(Context context) {
    LayoutInflater inflater = LayoutInflater.from(context);
    inflater.inflate(R.layout.my_view_layout, this);
}

+1,去掉“.png”确实有帮助,谢谢。您对如何从SmallTile.java(一个基于View的类)使用small_tile.xml有什么建议吗? - Alexander Farber
1
我更新了我的答案。你可能会发现这个教程有帮助:http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/。 - Bryan Herbst
为了使用LayoutInflater.inflate(),我不得不将SmallTile的基类从View更改为ViewGroup - Alexander Farber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接