用于 Spinner Android 的资源 NotFoundException
Posted
技术标签:
【中文标题】用于 Spinner Android 的资源 NotFoundException【英文标题】:Resources NotFoundException for Spinner Android 【发布时间】:2012-12-14 04:39:03 【问题描述】:我有一个有按钮的活动。单击按钮时,它应该打开一个简单的弹出窗口,其中包含一个 TextView 和一个 Spinner。我的弹出窗口打开得很好。我的问题是,当我获取 Spinner 的引用时,它给了我一个 Resources$NotFoundException 并说资源 ID 无效。
我目前正在调用 popupView.findViewById(R.layout.popup_create_workout) 以尝试获取对微调器的引用。我还尝试获取对弹出窗口使用的父 XML 布局的引用并在其上调用 finViewById(例如 exampleView.findViewById(R.layout.example_popup_view)。我还尝试了普通的 findViewById(R.layout.example_popup_view) (我没想到会起作用。但是,这两种技术都会在 View ID 上或当我在 Spinner 上调用 setAdapter() 时抛出 NullPointerExceptions。我尝试在 Eclipse 中清理项目,仔细检查以确保我正在使用正确的参考 ID、上下文等。
真正让我陷入循环的是,我能够从相同的 XML 布局获取对 TextView 的引用并对其进行操作。我搜索了整个网站,发现了一些类似的问题,但没有一个是我所需要的。我还用谷歌搜索了我能想到的一切,但没有运气。
所以,我的问题是:当我尝试获取微调器的引用时,为什么会得到 Resources$NotFoundException?我知道这可能很容易,但我似乎无法弄清楚。提前感谢您的帮助!
这是与微调器有关的部分活动:
@Override
public void onClick(View v)
LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = inflater.inflate(R.layout.popup_add_goal, null);
PopupWindow popupWindow = new PopupWindow(popupView);
popupWindow.setWidth(240);
popupWindow.setHeight(447);
popupWindow.update();
popupWindow.showAtLocation(v, Gravity.CENTER, 0, 0);
ArrayList<String> list = new ArrayList<String>();
list.add("Item 1");
list.add("Item 2");
list.add("Item 3");
Spinner spinner = (Spinner) popupView.findViewById(R.id.goal_spinner);
ArrayAdapter<ArrayList<String>> arrayAdapter = new ArrayAdapter<ArrayList<String>>(WorkoutActivity.context, R.id.list_content_white);
arrayAdapter.add(list);
spinner.setAdapter(arrayAdapter);
);
还有 XML 布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical"
android:background="#CCff0000" >
<TextView
android:id="@+id/textView1"
android:layout_
android:layout_
android:layout_gravity="center"
android:text="Add goals"
android:textColor="#ffffff"
android:textSize="48sp" />
<LinearLayout android:layout_
android:layout_
android:orientation="vertical" >
<TextView android:id="@+id/textView"
android:layout_
android:layout_
android:layout_marginTop="15dp"
android:text="Search for a goal"
android:textColor="#ffffff"
android:textSize="40sp"
android:gravity="center" />
<Spinner android:id="@+id/goal_spinner"
android:layout_
android:layout_
android:background="#ffffff" />
</LinearLayout>
最后,堆栈跟踪:
12-29 03:51:14.832: E/AndroidRuntime(5216): FATAL EXCEPTION: main
12-29 03:51:14.832: E/AndroidRuntime(5216): android.content.res.Resources$NotFoundException: Resource ID #0x7f09001a type #0x12 is not valid
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.content.res.Resources.loadXmlResourceParser(Resources.java:2144)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.content.res.Resources.getLayout(Resources.java:853)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:371)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.widget.Spinner.onMeasure(Spinner.java:439)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.View.measure(View.java:15513)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.View.measure(View.java:15513)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.View.measure(View.java:15513)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.Choreographer.doFrame(Choreographer.java:532)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.os.Handler.handleCallback(Handler.java:725)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.os.Handler.dispatchMessage(Handler.java:92)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.os.Looper.loop(Looper.java:137)
12-29 03:51:14.832: E/AndroidRuntime(5216): at android.app.ActivityThread.main(ActivityThread.java:5039)
12-29 03:51:14.832: E/AndroidRuntime(5216): at java.lang.reflect.Method.invokeNative(Native Method)
12-29 03:51:14.832: E/AndroidRuntime(5216): at java.lang.reflect.Method.invoke(Method.java:511)
12-29 03:51:14.832: E/AndroidRuntime(5216): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-29 03:51:14.832: E/AndroidRuntime(5216): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-29 03:51:14.832: E/AndroidRuntime(5216): at dalvik.system.NativeStart.main(Native Method)
这是包含 list_content_white 的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:gravity="center_vertical"
android:layout_
android:layout_ >
<TextView
android:id="@+id/list_content_white"
android:textColor="#ffffff"
android:textSize="30sp"
android:textStyle="bold"
android:layout_margin="8dp"
android:layout_
android:layout_ />
</LinearLayout>
【问题讨论】:
LogCat 跟踪 指向哪一行? 嗯,它实际上并没有给我一个特定的行(反正我没有看到)。我把整个堆栈跟踪放在了上面,这样你就可以继续看看了。 【参考方案1】:我不确定是什么导致了异常,但可能是这样。变化:
ArrayAdapter<ArrayList<String>> arrayAdapter = new ArrayAdapter<ArrayList<String>>(WorkoutActivity.context, R.id.list_content_white);
arrayAdapter.add(list);
收件人:
ArrayAdapter<String> arrayAdapter =
new ArrayAdapter<String>(WorkoutActivity.this, R.id.list_content_white, list);
// This is wrong, see below ^^^^
ArrayAdapter 已经需要一个 ArrayList,您只需提供 ArrayList 的子类型。
根本问题
将布局文件命名为与 View 的 id 相同的名称会有一点危险……你已经找到了。您想在初始化 ArrayAdapter 时使用 R.layout.list_content_white
not R.id.list_content_white
。
【讨论】:
你是对的。它没有修复异常,但它使我的代码更简洁。谢谢! 我更新了我的答案。你试过WorkoutActivity.this
而不是WorkoutActivity.context
吗?
好的。我尝试了 WorkoutPlannerPopup.this(这是保存此活动的类的名称)和 gestBaseContext(),但都没有解决问题...
“我试过 WorkoutPlannerPopup.this(这是保存此活动的类的名称)”查看我使用 R.layout.list_content_white
的最新(希望是最后一次)更新,但您可能需要使用 @ 987654328@ 也是。
名字其实不一样。对不起,我应该澄清一下。布局 XML 文件名为 list_layout_white_text,其中的 TextView 的 ID 为 list_content_white。此外,当我提供布局视图时,ArrayAdapter 会引发错误,因为它需要 TextView。【参考方案2】:
把这个放在onCreate()中的两行
LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = inflater.inflate(R.layout.popup_add_goal, null);
【讨论】:
这段代码其实已经在onCreateMethod中了。我发布的 onClickMethod 包含在 Button.OnClickListener 方法的 onCreate 方法中。以上是关于用于 Spinner Android 的资源 NotFoundException的主要内容,如果未能解决你的问题,请参考以下文章
Android——spinner控件实现读取xml资源,省市两级互动
Android开发系列(二十一):Spinner的功能和使用方法以及实现列表选择框