【问题标题】:How can I create my custom properties on xml for Android?如何在 Android 的 xml 上创建我的自定义属性?
【发布时间】:2011-01-03 00:52:55
【问题描述】:

我们的项目中有一个带有“Key”元素的键盘,这个Key元素有android:codes="119", android:keyLabel="w"等属性。

我的问题是如何包含一个自定义属性,如“android:alternativeKeyLabel”来做其他事情。

【问题讨论】:

    标签: java android


    【解决方案1】:

    这个链接给出了一个肤浅的解释: http://developer.android.com/guide/topics/ui/custom-components.html

    考虑到您有一个继承自 KeyboardView/View 的 CustomKeyboard:

    1. 在 res/values/attrs.xml 文件中创建您的自定义属性(如果该文件不存在,则创建该文件):
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
       <declare-styleable name="custom_keyboard">
            <attr name="alternative_key_label" format="string" />
        </declare-styleable>
    
    </resources>
    
    1. 在您的自定义组件中创建一个构造函数,覆盖接收属性集的默认构造函数,因为在加载布局时会调用这个构造函数。

      public CustomKeyboard(Context context, AttributeSet set) {
          super(context, set);
          TypedArray a = context.obtainStyledAttributes(set,R.styleable.custom_keyboard);
          CharSequence s = a.getString(R.styleable.custom_keyboard_alternative_key_label);
          if (s != null) {
              this.setAlternativeKeyLabel(s.toString());
          }
          a.recycle();
      }
      
    2. 在您的布局文件中,添加您的自定义组件和资源链接。

     <Layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res/your.package.ProjectName"
        .../>
        ...
        <your.package.projectname.CustomKeyboard
            android:id="@+id/my_keyboard"
            ...
            app:alternative_key_label="F">
        </your.package.projectname.CustomKeyboard>
    </Layout>
    

    【讨论】:

    • 当尝试使用来自库的自定义属性的自定义视图(例如自定义 Facebook 登录按钮)时,使用自定义属性的布局必须使用命名空间 URI“schemas.android.com/apk/res-auto”而不是包含应用程序的 URI包裹名字。在构建时,此 URI 将替换为特定于应用程序的 URI。也就是说,"xmlns:app..." 应替换为:xmlns:custom="schemas.android.com/apk/res-auto" 并且,在使用时,"app:custom_property..." 应替换为:"custom:custom_property..." Obs。 :只有 ADT 修订版 17+ 添加了对此的支持。
    • 致未来的读者:请仔细阅读完整的最后一个代码示例。顶层元素中的xmlns:app="http://schemas.android.com/apk/res/your.package.ProjectName 行是访问应用命名空间所必需的。
    • 根据@JPMagalhaes 信息:xmlns:custom="schemas.android.com/apk/res-auto 为我工作。谢谢!
    • @JPMagalhaes 你是个天才。简单直接。我只需要添加行xmlns:custom="http://schemas.android.com/apk/res-auto"除了 xmlns:android="http://schemas.android.com/apk/res/android",然后我可以从我正在使用的库中添加属性,例如我的自定义小部件中的custom:pstsUnderlineColor="#ffffff"。非常感谢!
    • @JPMagalheas 所说的关于编写 custom:mycustomattr 而不是 android:miscustomattr 并添加 xmlns:custom="schemas.android.com/apk/res-auto" 在我们不使用时也是如此库,但只有简单的 android 组件。
    【解决方案2】:

    对于任何其他目的,可以使用 attrs 构造函数参数检索在 XML 文件中声明的自定义属性。

    在我的例子中,我重用了一个偏好自定义对话框,并设置如下:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- something here -->
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
        <your.package.projectname.CustomView
            foo="bar"
        />
    </PreferenceScreen>
    

    然后在我的类构造函数中:

    public CustomView(Context context, AttributeSet attrs) {
        String bar = attrs.getAttributeValue(null, "foo");
        Log.d("CustomView", "foo=" + bar);
    }
    

    【讨论】:

      【解决方案3】:

      您可以为自己的扩展 View 或子类的类创建自定义属性。该过程记录在 Android 开发指南的“创建视图类”部分,标题为“定义自定义属性”:

      https://developer.android.com/training/custom-views/create-view#customattr

      【讨论】:

      • 所有 3 个链接都已失效 :( 这个答案无济于事。
      • 谷歌改变了他们的网站,与 9 年前相比,这不是我的错。 :) 这是 Google 关于制作自定义视图属性的文档的现代链接:developer.android.com/training/custom-views/…
      【解决方案4】:

      android:keyLabel 是 Keyboard.Key 类为键盘上的每个键使用的众多 XML 属性之一。 android:keyLabel 是您要标记密钥的内容(如上面的“w”)。属性是为类预定义的。 “w”不是,但 android:keyLabel 是。如果你可以创建 android:alternativeKeyLabel 你希望这个类用它做什么?我认为也许您应该尝试进一步解释您要完成的工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-29
        • 2017-08-18
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        相关资源
        最近更新 更多