7

Bir TextView içeren özel bir görünüm A var. TextView için resourceID döndüren bir yöntem yaptım. Hiçbir metin tanımlanmamışsa, yöntem varsayılan olarak -1 değerini döndürecektir. Ayrıca A görünümden devralan özel bir görünüm B var. Özel görünümüm "merhaba" metnine sahip. Süper sınıfın özniteliğini almak için yöntem çağırdığımda, bunun yerine -1 geri alırım.Android: Özel görünümün süper sınıfından bir özellik nasıl edinilir

Kodda, değeri nasıl alabileceğimin bir örneği de var, ancak bir tür hacky hissi veriyor.

attrs.xml

<declare-styleable name="A"> 
    <attr name="mainText" format="reference" /> 
</declare-styleable> 

<declare-styleable name="B" parent="A"> 
    <attr name="subText" format="reference" /> 
</declare-styleable> 

sınıfı

protected static final int UNDEFINED = -1; 

protected void init(Context context, AttributeSet attrs, int defStyle) 
{ 
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.A, defStyle, 0); 

    int mainTextId = getMainTextId(a); 

    a.recycle(); 

    if (mainTextId != UNDEFINED) 
    { 
     setMainText(mainTextId); 
    } 
} 

protected int getMainTextId(TypedArray a) 
{ 
    return a.getResourceId(R.styleable.A_mainText, UNDEFINED); 
} 

B sınıfı

protected void init(Context context, AttributeSet attrs, int defStyle) 
{ 
    super.init(context, attrs, defStyle); 

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.B, defStyle, 0); 

    int mainTextId = getMainTextId(a); // this returns -1 (UNDEFINED) 

    //this will return the value but feels kind of hacky 
    //TypedArray b = context.obtainStyledAttributes(attrs, R.styleable.A, defStyle, 0); 
    //int mainTextId = getMainTextId(b); 

    int subTextId = getSubTextId(a); 

    a.recycle(); 

    if (subTextId != UNDEFINED) 
    { 
    setSubText(subTextId); 
    } 
} 

I f sahip olduğu bir başka çözüm şimdiye kadar ound aşağıdakileri yapmaktır. Bunun bir tür hacky olduğunu düşünüyorum.

<attr name="mainText" format="reference" /> 

<declare-styleable name="A"> 
    <attr name="mainText" /> 
</declare-styleable> 

<declare-styleable name="B" parent="A"> 
    <attr name="mainText" /> 
    <attr name="subText" format="reference" /> 
</declare-styleable> 

Özel görünümün süper sınıfından nasıl özellik alınır? Kalıtımın özel görünümlerle nasıl çalıştığına dair iyi örnekler bulamıyorum.

cevap

8

Görünüşe göre bu bunu yapmak için doğru yolu: hattında TextView.java. kaynağında bir örnek

protected void init(Context context, AttributeSet attrs, int defStyle) { 
    super.init(context, attrs, defStyle); 

    TypedArray b = context.obtainStyledAttributes(attrs, R.styleable.B, defStyle, 0); 
    int subTextId = getSubTextId(b); 
    b.recycle(); 

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.A, defStyle, 0); 
    int mainTextId = getMainTextId(a); 
    a.recycle(); 

    if (subTextId != UNDEFINED) { 
     setSubText(subTextId); 
    } 
} 

yoktur 1098