【问题标题】:Custom component namespace invokation自定义组件命名空间调用
【发布时间】:2012-08-07 14:42:12
【问题描述】:

我在 Eclipse 的 Android 项目中调用自定义组件时遇到问题。似乎我不明白命名空间声明如何属于一起。我在 SO 上检查了其他几个线程,起初似乎是相关的,但我无法用这些解决我的问题:

我有以下设置(代码是匿名的):

/values/extra_attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="extraComponent">
        <attr name="count" format="integer" />
    </declare-styleable>
</resources>

/layout/extra_main.xml

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

/com.site.package.extra/extra.java

package com.site.package.extra;

... misc imports...

public class Extra extends FrameLayout
{
... misc code...
}

/com.site.package/main.java(启动类)

package com.site.package;

... misc imports...

public class Main extends Activity
{
... misc code...
}

/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  style="@style/main_style" 
  xmlns:extra="http://schemas.android.com/apk/res/com.site.package" >

  <com.site.package.Extra
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    extra:count="3">
  </com.site.package.Extra>
</RelativeLayout>

我面临的问题是;无论我做什么,我都无法调用我的自定义组件。错误发生在可能的布局中,我尝试更改以下项目:

  1. 名称空间声明
    • xmlns:extra="http://schemas.android.com/apk/res/com.site.package"
    • xmlns:extra="http://schemas.android.com/apk/res/com.site.package.extra"
    • xmlns:extra="http://schemas.android.com/apk/res/extra"
  2. 组件调用
    • &lt;com.site.package.extraComponent /&gt;
    • &lt;com.site.package.Extra.extraComponent /&gt;
    • &lt;extraComponent /&gt;
    • &lt;Extra.extraComponent /&gt;
    • &lt;android.view.ext.extraComponent /&gt;
  3. 属性
    • extra:count="3"
    • com.site.package.extra:count="3"

在这两种情况下,我都设法从智能感知中获得任何帮助,所以我完全迷失了。我真的不明白命名空间是如何在这里工作的,以及我应该如何让代码工作。

编辑:

我忘记包含我的 AndroidManifest.xml 文件。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.site.package"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk android:minSdkVersion="7" />

  <application
    android:icon="@drawable/ic_logo"
    android:label="MyApp"
    android:name="MyApp" >

  <activity
    android:label="MyApp"
    android:name=".Main" >
    <intent-filter >
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>
</manifest>

【问题讨论】:

    标签: java android namespaces custom-component


    【解决方案1】:

    您的自定义组件位于包 com.site.package.extra(来自您发布的代码)中,因此您可以在 xml 布局中使用它:

    <com.site.package.extra.Extra // ... other attributes
    

    或与:

    <view  class="com.site.package.extra.Extra"
         // ... other attributes />
    

    自定义属性的命名空间:

    xmlns:extra="http://schemas.android.com/apk/res/com.site.package"
    

    并使用它们:

    extra:count="3"
    

    【讨论】:

    • 这似乎是一个进步。我想我实际上在我的许多测试之一中尝试了这个,但是由于我无法让智能感知工作,我假设这是错误的并且没有测试运行。智能感知仍然没有提供任何帮助,所以我认为仍然存在一些问题。好吧,我继续尝试在调试器/模拟器中运行,然后出现异常:Binary XML file line #13: Error inflating class com.site.package.extra.Extra。你知道为什么不调用智能感知以及什么情况会导致这个错误吗?该程序在编辑器中没有给出任何错误或警告... :-(
    • @Ray'user1578904' 智能感知不适用于您的自定义视图,这是您手动操作的地方。在第 13 行的膨胀异常下方的 logcat 中,应该有导致该异常的原因(例如找不到类、构造函数中的 NullPointerException 等)。看看它告诉你什么。
    • 我得到这个原因有一个例外:java.lang.ClassNotFoundException: com.site.package.extra in loader dalvik.system.PathClassLoader@44e8d200
    • @Ray'user1578904' 在例外情况下,您发布的包 + 类名是 com.site.package.extra(这可能是您在 xml 布局中的方式),不应该是 com.site.package.extra.Extra 吗?
    • @Ray'user1578904' 很遗憾,我无法为您提供帮助,因为我不太使用图形编辑器。您可以使用该技巧并为您的View 实现isInEditMode 方法以返回true
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2012-04-02
    相关资源
    最近更新 更多