Intereting Posts
Метод раздувания для моей привязки не найден (с использованием Android, привязка данных). Воспроизведение звука в уведомлениях Android, хотя установлен режим бесшумного телефона Как извлечь текст из выбранного элемента в listView Как получить мой IP-адрес? Перепрограммировать высоту TextView SupportMapFragment воссоздается при изменении ориентации Как включить доступ к местоположению программно в android? Тип софт-клавиатуры в пользовательской HTML-странице Мягкая клавиатура без нажатия клавиш EditText & detecting Файл APK Repackage для хранения настраиваемых активов – какой инструмент построения использовать? Пример настраиваемого элемента spinnerDropDownViewResource Android fitsSystemWindows не работает при замене фрагментов Альтернатива Proguard для запутывания приложений для Android с использованием предварительно скомпилированных сторонних библиотек ZTE V9 не обнаружен АБР Измените переход на ввод / выезд DialogFragment как раз перед увольнением

Использовать XML-макет в качестве представления для подкласса View?

Мне кажется, что я знал, как это сделать, но сейчас я рисую пробел. У меня есть класс, который простирается от View ( Card ), и я написал макет для него в XML. Я хочу сделать, чтобы представление Card было представлением XML в конструкторе, поэтому я могу использовать методы в Card для установки TextView и whatnot. Какие-либо предложения? Код ниже:

Card.java: (У меня есть View.inflate(context, R.layout.card_layout, null); вот пример того, что я хочу сделать, но он не работает. Я в основном хочу, чтобы класс был интерфейсом для представления , И для этого мне нужно каким-то образом назначить XML-макет для представления. Использую ли я что-то в строках setContentView(View view) ? В классе View нет такого метода, но есть ли что-то подобное? )

 public class Card extends View { TextView tv; public Card(Context context) { super(context); View.inflate(context, R.layout.card_layout, null); tv = (TextView) findViewById(R.id.tv); } public Card(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); View.inflate(context, R.layout.card_layout, null); tv = (TextView) findViewById(R.id.tv); } public Card(Context context, AttributeSet attrs) { super(context, attrs); View.inflate(context, R.layout.card_layout, null); tv = (TextView) findViewById(R.id.tv); } public void setText(String text) { tv.setText(text); } } 

card_layout.xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="336dp" android:layout_height="280dp" android:layout_gravity="center" android:background="@drawable/card_bg" android:orientation="vertical" > <TextView android:id="@+id/tv" android:layout_height="fill_parent" android:layout_width="wrap_content" android:textSize="24dp" /> </LinearLayout> 

Solutions Collecting From Web of "Использовать XML-макет в качестве представления для подкласса View?"

То, что вы пытаетесь сделать, невозможно с текущей настройкой. View (или его прямой подкласс) представляет собой единое представление, в котором отсутствует понятие дочерних представлений, что вы пытаетесь сделать. LayoutInflater нельзя использовать с простым View потому что у простого класса View нет методов, чтобы фактически добавить к нему ребенка (например, метод addView() ).

С другой стороны, правильным классом для использования детей является ViewGroup (или один из прямых подклассов, таких как LinearLayout , FrameLayout т. Д.), FrameLayout принимают добавление к ним Views или других ViewGroups , предоставляя методы addView . В конечном итоге ваш класс должен быть:

 public class Card extends ViewGroup { TextView tv; public Card(Context context) { super(context); View.inflate(context, R.layout.card_layout, this); tv = (TextView) findViewById(R.id.tv); } public Card(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); View.inflate(context, R.layout.card_layout, this); tv = (TextView) findViewById(R.id.tv); } public Card(Context context, AttributeSet attrs) { super(context, attrs); View.inflate(context, R.layout.card_layout, this); tv = (TextView) findViewById(R.id.tv); } public void setText(String text) { tv.setText(text); } } 

Если я помню, вам нужно переопределить onLayout если вы расширяете ViewGroup , поэтому вместо этого (и из-за вашего файла макета) вы должны посмотреть на расширение LinearLayout и заменить LinearLayout из макета xml тегом merge .

Вы должны иметь возможность использовать свое имя класса в макете. Что-то вроде:

 <your.package.name.Card xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="336dp" android:layout_height="280dp" ... 

Просто вызовите findViewById чтобы получить дочерние представления.

Чтобы использовать свой класс Card, вы используете инфлятор для получения экземпляра, а затем присоедините его к родительскому виду.

 LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); Card card = (Card) inflater.inflate(R.layout.card_layout, null); parentView.addView(card); 

Взгляните на документы для получения дополнительной информации.