Help with a custom View attributes inside a Android Library Project

后端 未结 6 996
眼角桃花
眼角桃花 2020-11-30 21:55

I have a custom PieTimer View in an Android Library Project

package com.mysite.android.library.pietimer;

public class PieTimerView extends View {
...


        
相关标签:
6条回答
  • 2020-11-30 22:28

    There is a known bug and its described here: bug #9656. I have also described why this happens in my blog post.

    0 讨论(0)
  • 2020-11-30 22:32

    For all APIs this is the receipt ( if the library is linked as JAR , but should work also as android library project reference)

    Library project: AndroidManifest.xml

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.myapp.library1" 
    ... 
    </manifest>
    

    Library project: Attrs.xml

    <?xml version="1.0" encoding="utf-8"?> 
    <resources>    
    <declare-styleable name="MyCustStyle" >
          <attr name="MyAttr1" format="dimension" />  
        ..  
    </resources>
    

    App project MainLayout.xml (or the layout where u use the custom control)

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:library1="http://schemas.android.com/apk/com.myapp.library1"
    ...
    >
    
    <com.myapp.library1.MyCustomView 
            library1:MyAttr1="16dp"
    ...
    />
    </RelativeLayout>
    

    In App Code if you want to access resources from library use (ex. array "MyCustomArray" defined in the arrays.xml fromthe lib) use:

    getResources().getStringArray(com.myapp.library1.R.array.MyCustomArray)
    
    0 讨论(0)
  • 2020-11-30 22:34
    xmlns:app="http://schemas.android.com/apk/res/com.mysite.android.library.myapp"
    

    maybe the package(com.mysite.android.library.myapp) you specified is a wrong place. you can check the package attribute of the minifest element in the AndroidMinifest.xml file. they should be identical.

    0 讨论(0)
  • 2020-11-30 22:36

    I know this post is super old, but if anyone comes looking, this problem has been fixed in ADT revision 17+ . Any services or Activities declare the namespace as:

    xmlns:custom="http://schemas.android.com/apk/res-auto"
    

    res-auto will be replaced at build time with the actual project package, so make sure you set up your attribute names to avoid collisions if at all possible.

    ref: http://www.androidpolice.com/2012/03/21/for-developers-adt-17-sdk-tools-r17-and-support-package-r7-released-with-new-features-and-fixes-for-lint-build-system-and-emulator/

    0 讨论(0)
  • 2020-11-30 22:42

    After two hours of work with my coworker, we figure out how to make this work :

    Library : com.library

    mywidget.java with a class MyWidget

    attrs.xml :

        <declare-styleable name="MyWidget">
    

    and put your attr.

    Instead of having your layout (main.xml for example) with your widget declared in it, just create a my_widget.xml in the layout folder of your library.

    my_widget.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <com.library.MyWidget
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:widget="http://schemas.android.com/apk/res/com.library"
        android:id="@+id/your_id"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        widget:your_attr>
    </com.library.MyWidget>
    

    for including it in your layout, just put

    <include layout="@layout/my_widget"></include>
    

    App : com.myapp

    You just have to duplicate my_widget.xml here, and change the namespace :

    <?xml version="1.0" encoding="utf-8"?>
    <com.library.MyWidget
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:widget="http://schemas.android.com/apk/res/com.myapp" <---- VERY IMPORTANT
        android:id="@+id/your_id"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        widget:your_attr>
    </com.library.MyWidget>
    

    And normally it will work !

    0 讨论(0)
  • 2020-11-30 22:45

    This solution worked for me:

    https://gist.github.com/1105281

    It doesn't use the TypedArray and requires the view to have the library's project package name hardcoded in it.

    It also does not use the styleable values on the programmatic level. You have to hardcode the attribute strings into the view as well.

    You should however declare those same attribute names styleable for Lint to not show an error when you write the XML part.

    A link to the original post on code.google.com:

    http://code.google.com/p/android/issues/detail?id=9656#c17

    It definitely beats copying the files and changing the namespaces but it still isn't as elegant as should be. Enjoy.

    0 讨论(0)
提交回复
热议问题