Intereting Posts
Когда фрагмент потерял фокус, а затем восстановил фокус, почему его метод onResume () никогда не вызывается в этот период? Logcat не отображает сообщения Log.d Как масштабировать растровое изображение до размера экрана? TextToSpeech с API 21 Android: почему моментальные снимки и gpu являются взаимоисключающими? GridView с динамическим числом столбцов в каждой строке Как узнать, доступен ли фрагмент? Невозможно включить заголовки C ++, такие как вектор в Android NDK Android, simple-xml, как объявить список элементов? OnCreate () и onCreateView () вызывает намного больше, чем требуется (фрагменты) Создает ли родительский клик для всех дочерних элементов кликабель? Как предотвратить закрытие диалогового окна при нажатии кнопки Cordova ubuntu: Произошла ошибка при отображении Android-целей Предпочтения в предпочтении в Android-приложении Установите модуль в опции «Редактировать конфигурации» в программе intelliJ / Android Studio?

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

Мне нужно создать более сложный пользовательский вид в Android. Окончательный макет должен выглядеть следующим образом:

<RelativeLayout> <SomeView /> <SomeOtherView /> <!-- maybe more layout stuff here later --> <LinearLayout> <!-- the children --> </LinearLayout> </RelativeLayout> 

Однако в XML-файлах я просто хочу определить это (без указания SomeView, SomeOtherView и т. Д.):

 <MyCustomView> <!-- the children --> </MyCustomView> 

Возможно ли это в Android, и если да: каким будет самый чистый способ сделать это? Возможные решения, которые пришли мне на ум, были «переопределить методы addView ()» и «удалить все представления и добавить их позже», но я не уверен, куда идти …

Большое спасибо за вашу помощь! 🙂

Solutions Collecting From Web of "Android: несколько видов просмотра для пользовательского представления с существующим макетом"

Совершенно возможно и поощрять создание пользовательских представлений контейнеров. Это то, что Android назвал бы составным элементом управления. Так:

 public class MyCustomView extends RelativeLayout { private LinearLayout mContentView; public MyCustomView(Context context) { this(context, null); } public MyCustomView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyCustomView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); //Inflate and attach your child XML LayoutInflater.from(context).inflate(R.layout.custom_layout, this); //Get a reference to the layout where you want children to be placed mContentView = (LinearLayout) findViewById(R.id.content); //Do any more custom init you would like to access children and do setup } @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { if(mContentView == null){ super.addView(child, index, params); } else { //Forward these calls to the content view mContentView.addView(child, index, params); } } } 

Вы можете переопределить столько версий addView() сколько вам нужно, но в конце концов все они обращаются к версии, помещенной в образец. Переопределение только этого метода будет иметь рамки, которые передают всем детям, находящимся внутри его тега XML, в конкретный дочерний контейнер.

Затем измените XML как таковой:

разреш / макет / custom_layout.xml

 <merge> <SomeView /> <SomeOtherView /> <!-- maybe more layout stuff here later --> <LinearLayout android:id="@+id/content" /> </merge> 

Причиной использования <merge> является упрощение иерархии. Все дочерние представления привязаны к вашему пользовательскому классу, который является RelativeLayout . Если вы не используете <merge> , вы получите RelativeLayout прикрепленный к другому RelativeLayout прикрепленному ко всем детям, что может вызвать проблемы.

НТН

Вы можете использовать тег include

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <include android:id="@+id/nav_bar_layout" layout="@layout/nav_bar" android:layout_above="@+id/web_view" /> <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/web_view" android:layout_centerInParent="true" /> <include android:id="@+id/admob_layout" layout="@layout/admob_layout" android:layout_below="@+id/web_view" /> </RelativeLayout>