سؤال

تطبيق Android الذي أقوم به حاليا لديه نشاط رئيسي نمت كبيرة جدا. هذا هو أساسا لأنه يحتوي على TabWidget مع 3 علامات تبويب. تحتوي كل علامة تبويب على عدد قليل من المكونات. يجب أن يتحكم النشاط في كل هذه المكونات في وقت واحد. لذلك أعتقد أنه يمكنك تخيل أن هذا النشاط يحتوي على 20 حقلا (حقل لكل مكون تقريبا). كما أنه يحتوي على الكثير من المنطق (انقر فوق المستمعين، المنطق لملء قوائم، إلخ).

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

حاولت معرفة كيفية القيام بذلك، ووجدت شيئا في وثائق أندرويد ما يرغبون في الاتصال ب "عنصر تحكم مركب". (يرى http://developer.android.com/guide/topics/ui/custom-omponents.html#compound. والتمرير إلى قسم "التحكم في المركب") أود إنشاء مثل هذا المكونات بناء على ملف XML يحدد بنية العرض.

في الوثائق تقول:

لاحظ أنه تماما مثل النشاط، يمكنك استخدام نهج التصريح (استنادا عن XML) لإنشاء المكونات الموجودة، أو يمكنك أن تزيلها برمجيا من التعليمات البرمجية.

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

لذلك حاولت إزالة XML يدويا مثل هذا:

public class MyCompoundComponent extends LinearLayout {

    public MyCompoundComponent(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.my_layout, this);
    }
}

هذا يعمل، باستثناء حقيقة أن XML أنا تحميل لديه LinearLayout أعلن باسم عنصر الجذر. هذا يؤدي إلى تضخم LinearLayout كونه طفل MyCompoundComponent التي نفسها بالفعل LinearLayout! حتى الآن لدينا خط Linearlayout الزائد بين MyCompoundComponent والآراء التي تحتاجها في الواقع.

هل يمكن لشخص ما أن تقدم لي طريقة أفضل للتعامل مع هذا، وتجنب وجود زائدة عن الحاجة LinearLayout مثيل

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

المحلول

يستخدم دمج علامة كجذر XML الخاص بك

<merge xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Your Layout -->
</merge>

تحقق من هذه المقالة.

نصائح أخرى

أعتقد أن الطريقة التي من المفترض أن تفعلها، تستخدم اسم الفصل الخاص بك كعنصر جذر XML:

<com.example.views.MyView xmlns:....
       android:orientation="vertical" etc.>
    <TextView android:id="@+id/text" ... />
</com.example.views.MyView>

ثم امسك صفك من أي تخطيط تريد استخدامه. لاحظ أنه إذا كنت تستخدم هذه الطريقة لا استخدم تخطيط نفث هنا.

public class MyView extends LinearLayout
{
    public ConversationListItem(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }
    public ConversationListItem(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }


    public void setData(String text)
    {
        mTextView.setText(text);
    }

    private TextView mTextView;

    @Override
    protected void onFinishInflate()
    {
        super.onFinishInflate();

        mTextView = (TextView)findViewById(R.id.text);
    }
}

ثم يمكنك استخدام وجهة نظرك في تخطيطات XML كالمعتاد. إذا كنت ترغب في جعل العرض برمجيا، عليك أن تضخيمها بنفسك:

MyView v = (MyView)inflater.inflate(R.layout.my_view, parent, false);

لسوء الحظ، هذا لا يسمح لك بذلك v = new MyView(context) لأنه لا يبدو أنه هناك طريقة حول مشكلة تخطيطات المتداخلة، لذلك هذا ليس حل كامل حقا. يمكنك إضافة طريقة مثل هذا ل MyView لجعلها أجمل قليلا:

public static MyView create(Context context)
{
    return (MyView)LayoutInflater.fromContext(context).inflate(R.layout.my_view, null, false);
}

إخلاء المسئولية: قد أتحدث عن Bollocks كاملة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top