2012-03-16 18 views
6

私はアンドロイドのカスタムコントロールに取り組んでいますが、私は何を示そうとしましたが、hereは間違っているようです。Androidカスタムコントロールネームスペースの問題

ここでは誰もが問題を見つけることができるかどうかを確認するために私のコードです:

MyComponent.java

public MyComponent(Context context, AttributeSet attrs) 
{ 
    super(context); 
    TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MyComponent); 
    CharSequence myId = arr.getString(R.styleable.MyComponent_identifier); 

    if (myId != null) 
    { 
    this.setIdentifier(myId.toString()); 
    } 

    Integer cds = arr.getInteger(R.styleable.MyComponent_cd_number, 0); 

    if(cds != null) 
    { 
    this.setCds(cds); 
    } 

    arr.recycle(); 
} 

attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyComponent">  
    <attr name="cd_number" format="integer" /> 
    <attr name="identifier" format="string" /> 
    </declare-styleable> 
</resources> 

main.xml

<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:bgl="http://schemas.android.com/apk/res/my.test.package.components" 
    android:id="@+id/table" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    ... 

    <my.test.package.MyComponent 
    android:id="@+id/hand" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_span="2" 
     bgl:cd_number="4" 
     bgl:identifier="plr"/> 

    ... 

    </TableLayout> 

私はこれを置くとき、私は次のエラーを取得:

エラー:パッケージ「my.test.package」 エラーの属性「cd_number」が見つかりませんリソース識別子:属性が見つかりませんリソース識別子をパッケージの「識別子」「my.test.package」

私のようなものに自分の名前空間を変更する場合:

xmlns:bgl="http://schemas.mywhatever.com/apk/res/my.test.package" 

...エラーがワットに行きますayとその事が実行されますが、myIdはnullで、cdsはMyComponent.javaコンストラクタに戻って0(デフォルト値!)です。

私はそれはいくつかの非常に基本的な間違いだと思いますが、私はそれを見つけることができないし、これに関する多くのドキュメンテーションがないので、ここで尋ねることにしました。

ありがとうございます!

答えて

14

オクラホマに取るコンストラクタで試してみてください

異なるコンストラクタを呼んでいたが判明しました。私はそれを解決した!

xmlns:bgl="http://schemas.android.com/apk/res/my.test.package 

を...しかし、私の元に私が持っていた::

は、オリジナルのポストで私が持っていた

xmlns:bgl="http://schemas.android.com/apk/res/my.test.package.components 

...私は1つのコンポーネントパッケージにURIを置く必要があると思ったので、 。

これは間違っています。

xmlnsには、マニフェストで宣言されているアプリケーション名でなければなりません!

xmlnsの「コンポーネント」部分を削除すると、マニフェスト内のアプリケーション名に「一致」し、エラーが消えてしまいました。デバッグでそのオブジェクトを実行したとき、実際にパラメータに渡していた値を確認できましたXMLで!

これは他の人に役立つことを願っています! :-)

UPDATE

後、私にライブラリにコントロールを移動する必要があったし、再び問題に直面しました。 (その場合

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

(とAndroidの依存関係として宣言ライブラリ持っている)Eclipseを:あなたがライブラリ内のコンポーネントを入れて、クライアントアプリケーションでそれを使用するときには、以下のようにのxmlnsを宣言しなければならないようですそれともAndroidですか?)は、適切な属性バインディングの依存関係を検索します。

+1

偉大な仕事を研究し、答えを提供します。 res-auto fixはまさに私が必要としていたものです。 – AlanKley

+0

'res-auto'あなたは美人です! – darksider474

+0

bglとmynsとは何ですか、どうすればその名前を設定できますか – Nepster

0

私はこれと同様の問題があった、それはdefStyleパラメータ

public MyComponent(Context context, AttributeSet attrs, int defStyle) 
+0

ありがとうございます。残念ながら私の問題は別のものと思われます。あなたが提案したctorを定義しました。私が名前空間を変更しなければ、エラーは持続します。 xmlnsを変更すると、同じ動作をします。新しいctorは呼び出されず、myIdはnullであり、以前と同じようにcdsは0です。他のアイデア?誰でも? –