无法使用自定义组件保存 Android XML 文件

Posted

技术标签:

【中文标题】无法使用自定义组件保存 Android XML 文件【英文标题】:Can't save Android XML file with custom component 【发布时间】:2011-07-15 17:35:44 【问题描述】:

我使用一些自定义组件创建了 android XML 布局。但是当我保存 XML 文件时,我得到了错误。由于这是我第一次使用自定义组件(小部件),我不知道为什么会出现此错误。 这是我的 xml 代码。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:layout_marginTop="12dp"
android:orientation="vertical"
android:background="@drawable/layout_bg">

<LinearLayout
    android:layout_
    android:layout_
    android:layout_gravity="center_horizontal"
    android:paddingLeft="12dp"
    android:paddingRight="12dp"
    android:paddingTop="30dp">

  <kankan.wheel.widget.WheelView android:id="@+id/day"
        android:layout_
        android:layout_/>
    <kankan.wheel.widget.WheelView android:id="@+id/month"
        android:layout_
        android:layout_/>
    <kankan.wheel.widget.WheelView android:id="@+id/year"
        android:layout_
        android:layout_/> 


</LinearLayout>

这是我得到的错误。 不得不说,R.java文件中没有这样的资源值

错误! NotFoundException: 不能 解析资源值:0x7F020009。

android.content.res.Resources$NotFoundException: 无法解析资源值: 0x7F020009。在 com.android.layoutlib.bridge.BridgeResources.throwException(BridgeResources.java:546) 在 com.android.layoutlib.bridge.BridgeResources.getDrawable(BridgeResources.java:131) 在 kankan.wheel.widget.WheelView.initResourcesIfNecessary(WheelView.java:427) 在 kankan.wheel.widget.WheelView.calculateLayoutWidth(WheelView.java:482) 在 kankan.wheel.widget.WheelView.onMeasure(WheelView.java:518) 在 android.view.View.measure(View.java:7964) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888) 在 android.widget.LinearLayout.measureHorizo​​ntal(LinearLayout.java:619) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:280) 在 android.view.View.measure(View.java:7964) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023) 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:350) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 在 android.view.View.measure(View.java:7964) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 在 android.view.View.measure(View.java:7964) 在 com.android.layoutlib.bridge.Bridge.computeLayout(Bridge.java:443) 在 com.android.ide.common.rendering.LayoutLibrary.createLegacySession(LayoutLibrary.java:404) 在 com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:285) 在 com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1506) 在 com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1312) 在 com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1043) 在 com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.onXmlModelChanged(GraphicalEditorPart.java:1005) 在 com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.xmlModelChanged(LayoutEditor.java:303) 在 com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor$XmlModelStateListener.modelChanged(AndroidXmlEditor.java:1213) 在 org.eclipse.wst.sse.core.internal.model.AbstractStructuredModel.fireModelChanged(AbstractStructuredModel.java:553) 在 org.eclipse.wst.sse.core.internal.model.AbstractStructuredModel.internalModelChanged(AbstractStructuredModel.java:887) 在 org.eclipse.wst.sse.core.internal.model.AbstractStructuredModel.changedModel(AbstractStructuredModel.java:382) 在 org.eclipse.wst.xml.core.internal.document.DOMModelImpl.changedModel(DOMModelImpl.java:167) 在 com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor.wrapEditXmlModel(AndroidXmlEditor.java:803) 在 com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode.setPropertyValue(UiElementNode.java:1885) 在 com.android.ide.eclipse.adt.internal.editors.layout.gle2.CanvasViewInfo.setPropertyValue(CanvasViewInfo.java:320) 在 org.eclipse.ui.views.properties.PropertySheetEntry.valueChanged(PropertySheetEntry.java:782) 在 org.eclipse.ui.views.properties.PropertySheetEntry.setValue(PropertySheetEntry.java:723) 在 org.eclipse.ui.views.properties.PropertySheetEntry.applyEditorValue(PropertySheetEntry.java:146) 在 org.eclipse.ui.views.properties.PropertySheetEntry$1.applyEditorValue(PropertySheetEntry.java:103) 在 org.eclipse.jface.viewers.CellEditor$1.run(CellEditor.java:333) 在 org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 在 org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49) 在 org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 在 org.eclipse.jface.viewers.CellEditor.fireApplyEditorValue(CellEditor.java:331) 在 com.android.ide.eclipse.adt.internal.editors.ui.EditableDialogCellEditor.handleDefaultSelection(EditableDialogCellEditor.java:264) 在 com.android.ide.eclipse.adt.internal.editors.ui.EditableDialogCellEditor$1.widgetDefaultSelected(EditableDialogCellEditor.java:83) 在 org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:119) 在 org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 在 org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066) 在 org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657) 在 org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640) 在 org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604) 在 org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438) 在 org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671) 在 org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 在 org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664) 在 org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 在 org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115) 在 org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(未知 来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知 来源)在 java.lang.reflect.Method.invoke(未知 来源)在 org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619) 在 org.eclipse.equinox.launcher.Main.basicRun(Main.java:574) 在 org.eclipse.equinox.launcher.Main.run(Main.java:1407) 在 org.eclipse.equinox.launcher.Main.main(Main.java:1383)

请帮我解决这个错误。提前致谢。

【问题讨论】:

您是否将文件命名为 mylayout.xml?然后你忘了 -> 在xml文件的开头并在第一个布局元素中声明命名空间 -> xmlns:android="schemas.android.com/apk/res/android" 修复了布局,因此 xml 开始实际上是可见的 :) “xmlns:android...”的修复现在有效了吗?也许您还应该清理项目并重新构建它。 “kankan.wheel.widget”包中是否有 WheelView 组件? 这是 main.xml。我已经声明了命名空间。当我删除所有三个自定义组件(WheelView)时,它不会出错。 @rainer :需要明确的是,我修复了问题的布局,名称空间一直都在那里,但@chrishi 在 SO 上的格式正在跳过它。 【参考方案1】:

要解决这个问题,我要做的就是删除以下导入:

import kankan.wheel.R; // remove this line

当您复制并粘贴示例演示中的代码时会自动添加

Remove the line highlighted in this screen grab

【讨论】:

这种问题可能有多个根本原因,这里没有提到的一个根本原因是在自定义视图初始化代码中访问资源 - 见***.com/questions/11543855/…【参考方案2】:

有一个资源没有找到。它可以是例如你用的是@drawable/layout_bg

如果不是这样,看看这两行:

initResourcesIfNecessary(WheelView.java:427) 
calculateLayoutWidth(WheelView.java:482) 

您在那里调用的东西正在请求不存在的资源(Id、drawable 等)。

【讨论】:

如果这是问题所在,那么当他取出他的自定义组件时它就不会起作用了。 我已将 layout_bg 添加到可绘制文件夹中,它位于 R.java 文件中。 @stealthcopter :是的,但是当我发布该评论时,我没有阅读该评论。所以问题应该出在 WheelView.java 文件中的 initResourcesIfnecessary 中。 将资源导入我的项目时出现了一些问题。在你的帮助下我已经解决了。谢谢。【参考方案3】:

每件事都是正确的。请检查可绘制文件夹中 layout_bg 的图像格式。 支持的格式:

1.jpg 2.png 3.bmp

(例如:Android 接受 .jpg,而不是 .jpeg)。

【讨论】:

这是一个自定义布局。不是图片。 自定义布局中有什么? 这是自定义布局中的代码。 schemas.android.com/apk/res/android"> 顺便说一句,我已经解决了我的问题。将资源导入我的项目时出现了一些问题。感谢您的帮助。【参考方案4】:

我通过"try-catching"方法中的资源访问解决了这个问题

     initResourcesIfNecessary

我知道这不是理想的解决方案,但至少现在我可以在设计时编辑我的布局。

修改后的方法如下

        private void initResourcesIfNecessary() 


    if (centerDrawable == null) 
        try 
            centerDrawable = getContext().getResources().getDrawable(R.drawable.wheel_val);
         catch (Exception ex) 
            centerDrawable = null;
        
    

    if (topShadow == null) 
        try 
            topShadow = new GradientDrawable(Orientation.TOP_BOTTOM, SHADOWS_COLORS);
         catch (Exception ex) 
            topShadow = null;
        
    

    if (bottomShadow == null) 
        try 
            bottomShadow = new GradientDrawable(Orientation.BOTTOM_TOP, SHADOWS_COLORS);
         catch (Exception ex) 
            bottomShadow = null;
        
    
    try 
        setBackgroundResource(R.drawable.wheel_bg);
     catch (Exception ex) 
        setBackgroundResource(0);
    

【讨论】:

以上是关于无法使用自定义组件保存 Android XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

Android中自定义属性的使用

android :framework层自定义theme无法取得

如何在片段 xml 中使用自定义组件?

如何使用 XML 根据图像大小调整 Android 组件的大小

android 广播自定义广播接收问题

Android 自定义View