Android: как создать экземпляр моего пользовательского представления с помощью конструктора атрибутов

Мое пользовательское представление имеет динамический настраиваемый атрибут, например. атрибут backgroundimage, назначить через текущую неделю. Я не буду использовать конструктор CalendarView (контекст контекста, AttributeSet attrs) для передачи нескольких атрибутов, и я пытаюсь создать экземпляр атрибута с помощью Xml.asAttributeSet, но он не может работать. может кто-нибудь сказать мне, как это сделать.

Примечание. Мое пользовательское представление имеет динамический атрибут, поэтому я не хочу создавать экземпляр пользовательского представления через макет xml. Мое решение неверно?

вот пользовательский вид:

public class CalendarView extends View {
    int backgroundImage;
    public CalendarView(Context context, AttributeSet attrs) {
        super(context, attrs);
        backgroundImage = attrs.getAttributeResourceValue("http://www.mynamespace.com", "backgroundimage", 0); 
    }
}

вот активность:

public class TestActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(createTestView(0));
    }


public CalendarView createTestView(int currentWeek) throws XmlPullParserException, IOException {
    String attributes = "<attribute xmlns:android=\"http://schemas.android.com/apk/res/android\" " +
        "xmlns:test=\"http://www.mynamespace.com\" " +
        "android:layout_width=\"fill_parent\" android:layout_height=\"30\" " +
        "test:backgroundimage=\"@drawable/"+ currentWeek +"_bg" + "\"/>";

    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();          
    factory.setNamespaceAware(true);
    XmlPullParser parser = factory.newPullParser();
    parser.setInput(new StringReader(attributes));
    parser.next();
    AttributeSet attrs = Xml.asAttributeSet(parser);
    return new CalendarView(this,attrs);
}
}

Ответы

Ответ 1

Вы должны объявить атрибут как styleable в файле attr.xml, расположенном в значениях

например:

<declare-styleable name="yourView">
    <attr name="aAttr" format="dimension" />
    <attr name="bAttr" format="dimension" />
   >

После этого вы должны использовать их как это в своем пользовательском представлении, и вы должны объявить оба конструктора по умолчанию:

  public CalendarView(Context context) {
     super(context);
   }

public CalendarView(Context context, AttributeSet attrs) {
    super(context, attrs);
    backgroundImage = attrs.getAttributeResourceValue("http://www.mynamespace.com", 
   "backgroundimage", 0); 
    int typefaceIndex = attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android", "typeface", 0);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.yourView);
}

Это должно работать, чтобы получить параметры для вашего пользовательского представления. Не стесняйтесь спрашивать, не расстались ли вы.

typeFaceindex - это просто пример, который работает.

После этого вы должны использовать свой customView в макете, как и любой другой:

<com.example.yourView> </com.example.yourView>

Ответ 2

Возможно, я не понимаю, что вы делаете, или почему вы это делаете, но я нахожу вашу попытку с AttributeSet довольно сложной.

Я предлагаю вам создать другой конструктор, подобный этому

public CalendarView(Context context, int backgroundRessourceID) {
    super(context);

    setBackgroundResource(backgroundRessourceID);
}

И затем создайте экземпляр своего Календаря таким образом

CalendarView cv = new CalendarView(this, R.drawable.0_bg);
cv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 30));

Надеюсь, это решило вашу проблему...