اندرويد:عرض مخصص مع مرجع الكائن من أترس.شمل ، دائما فارغة

StackOverflow https://stackoverflow.com//questions/9624973

سؤال

أحاول إعداد تسلسل هرمي للعلاقة بين الكائنات.كل كائن له أصل من نفس النوع نفسه ، أو null.

لدي main.xml يحتوي على بعض هذه:

<com.morsetable.MorseKey
    android:id="@+id/bi"
    android:layout_weight="1"
    custom:code=".."
    custom:parentKey="@id/be"
    android:text="@string/i" />

a res/values/attrs.xml التي تحتوي على واحدة من هذه:

<declare-styleable name="MorseKey">
    <attr name="code" format="string"/>
    <attr name="parentKey" format="reference"/>
</declare-styleable>

وفئة (هذا ليس نشاطي) تحتوي على هذا:

public class MorseKey extends Button {

    public MorseKey(Context context, AttributeSet attrs) {
        super(context, attrs);
        initMorseKey(attrs);
    }

    private void initMorseKey(AttributeSet attrs) {
        TypedArray a = getContext().obtainStyledAttributes(attrs,
                          R.styleable.MorseKey);
        final int N = a.getIndexCount();
        for (int i = 0; i < N; i++) {
            int attr = a.getIndex(i);
            switch (attr)
            {
            case R.styleable.MorseKey_code:
                code = a.getString(attr);
                break;
            case R.styleable.MorseKey_parentKey:
                parent = (MorseKey)findViewById(a.getResourceId(attr, -1));
                //parent = (MorseKey)findViewById(R.id.be);
                Log.d("parent, N:", ""+parent+","+N);
                break;
            }
        }
        a.recycle();
    }

    private MorseKey parent;
    private String code;
}

هذا لا يعمل.كل MorseKey تقارير المثيل N == 2 (جيد) و parent == null (سيئة).المزيد, parent == null حتى عندما أحاول صراحة تعيينه إلى بعض القيمة التعسفية (انظر التعليق).لقد حاولت أيضا custom:parentKey="@+id/be" (مع علامة الجمع) ولكن هذا لم ينجح أيضا.ماذا أفعل خطأ?

هل كانت مفيدة؟

المحلول

إذا كانت فئة مورسيكي الخاصة بك في ملف جافا منفصل ، والتي أفترض هو الحال من بيانمنت الخاص بك "فئة (وهذا ليس نشاطي)".ثم أعتقد أن المشكلة هي في استخدامك ل فيندفيوبيد ().فيندفيوبيد () سوف تبحث عن مورد داخل عرض مورسيكي نفسه بدلا من الرئيسي.ملف شمل.

ربما حاول الحصول على الوالد من مثيل مورسيكي واستدعاء الوالد.فيندفيوبيد ().

case R.styleable.MorseKey_parentKey:
    parent = this.getParent().findViewById(a.getResourceId(attr, -1));

على الرغم من أن هذا لن يعمل إلا إذا كان الوالد مورسيكي والطفل في نفس التخطيط.

<LinearLayout ...>
     <MorseKey ..../><!-- parent -->
     <MorseKey ..../><!-- child -->
</LinearLayout>

ولكن سيكون من الصعب جدا العثور على طريقة العرض إذا كان التخطيط الخاص بك هو شيء من هذا القبيل مع الوالد والطفل في تخطيطات منفصلة.

<LinearLayout ...>
     <MorseKey ..../><!-- parent -->
</LinearLayout>
<LinearLayout ...>
     <MorseKey ..../><!-- child -->
</LinearLayout>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top