0

I'm trying to create custom xml attributes, which can be accepted by more classes then one. I've found (among others) this helpful answer: Defining custom attrs

But how to i access the attribute programmaticly? Eclipse does not seem to find the defined names:

Here is my attrs.xml, it's 'ViewPadding i'm trying to use:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="ViewPadding" format="integer"/>
<declare-styleable name="IntegerPicker">
    <attr name="maxNrOfDigits" format="integer"/>
    <attr name="NumberSize" format="integer"/>
    <attr name="ViewColor" format="color"/>
    <attr name="TextAlignRight" format="boolean"/>
</declare-styleable>

<declare-styleable name="DoublePicker">
    <attr name="CompoundViewColor" format="color"/>
    <attr name="CompoundViewPadding" format="integer"/>
</declare-styleable>
</resources>

This is the code i use to access the other attributes:

public IntegerPicker(Context context, AttributeSet attrs) {
    super(context, attrs);

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.integer_picker, this, true);

    etInteger = (EditText) findViewById(R.id.etInteger);

    TypedArray a = context.obtainStyledAttributes(attrs,
            R.styleable.IntegerPicker);

        final int N = a.getIndexCount();
        for (int i = 0; i < N; ++i)
        {
            int attr = a.getIndex(i);
            switch (attr)
            {
            case R.styleable.IntegerPicker_ViewColor:
                int ViewColor = a.getColor(attr, 0);
                this.setBackgroundColor(ViewColor);
                break;
            case R.styleable.IntegerPicker_maxNrOfDigits:
                int ems = a.getInteger(attr, 8);
                etInteger.setEms(ems);
                break;
            case R.styleable.:
                int padding = a.getInteger(attr, 10);
                etInteger.setPadding(padding, padding, padding, padding);
                break;
            case R.styleable.IntegerPicker_NumberSize:
                int NumberSize = a.getInteger(attr, 10);
                etInteger.setTextSize(NumberSize);
                break;
            case R.styleable.IntegerPicker_TextAlignRight:
                boolean textAlignRight = a.getBoolean(attr,false);
                if(textAlignRight){
                    etInteger.setGravity(0x05);
                }else{
                    etInteger.setGravity(0x03);
                }
            }
        }
        a.recycle();

}

How do i handle:

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.integer_picker, this, true);

and

case R.styleable.IntegerPicker_ViewColor:
                int ViewColor = a.getColor(attr, 0);
                this.setBackgroundColor(ViewColor);

Please help, i'm really at a loss here :S

Community
  • 1
  • 1
SverkerSbrg
  • 503
  • 1
  • 9
  • 23

1 Answers1

0

I'm not an expert in this but you might wish to try this: (Taken from SlidingMenu)

attrs.xml

<!--
  Copyright 2011 The Android Open Source Project

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<resources>

    <declare-styleable name="SlidingMenu">
        <attr name="mode">
            <enum name="left" value="0" />
            <enum name="right" value="1" />
        </attr>
        <attr name="viewAbove" format="reference" />
        <attr name="viewBehind" format="reference" />
        <attr name="behindOffset" format="dimension" />
        <attr name="behindWidth" format="dimension" />
        <attr name="behindScrollScale" format="float" />
        <attr name="touchModeAbove">
            <enum name="margin" value="0" />
            <enum name="fullscreen" value="1" />
        </attr>
        <attr name="touchModeBehind">
            <enum name="margin" value="0" />
            <enum name="fullscreen" value="1" />
        </attr>
        <attr name="shadowDrawable" format="reference" />
        <attr name="shadowWidth" format="dimension" />
        <attr name="fadeEnabled" format="boolean" />
        <attr name="fadeDegree" format="float" />
        <attr name="selectorEnabled" format="boolean" />
        <attr name="selectorDrawable" format="reference" />
    </declare-styleable>

</resources>

Code to get xml attribute (in the view constructor)

    // get all attributes
    final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.SlidingMenu);
    // extract 1 attribute, of return SlidingMenu.LEFT if no attr was supplied)
    final int mode = ta.getInt(R.styleable.SlidingMenu_mode, SlidingMenu.LEFT);
Corey Scott
  • 2,430
  • 3
  • 28
  • 33
  • I'm sorry if i've missread it, but these attributes does only work with the SlidningMenu class. I want to use the attributes with several classes. Like this (from the link above) You can define attributes in the top element or inside of a element. If I'm going to use an attr in more than one place I put it in the root element. Note, all attributes share the same global namespace. My problem is that i do not know how to adress it after i've declared the attrs – SverkerSbrg Apr 15 '13 at 07:36
  • I imagine that they are not tied to the class. You should be able to access your attrs values via final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.IntegerPicker); and ta.getInt(R.styleable.IntegerPicker_maxNrOfDigits, -1) – Corey Scott Apr 15 '13 at 15:53
  • Yes, the ones tied to the class i can access but not the free ones. Altho the major problem what that i had miss understood the mening of the name in the declare-styleable. – SverkerSbrg Apr 15 '13 at 21:27