Intereting Posts
Радиальный градиент для разных dpi Ошибка, включая Android-DirectionalViewPager .jar в Eclipse Нажатие назад не возвращается к предыдущему фрагменту Замена нити пользовательского интерфейса с помощью AsyncTask Создание эффектов ластиков с использованием libgdx и OpenGL ES Как я могу присвоить растровое изображение android растровому изображению из другого размера (алиасы drawable-large-mdpi в drawable-hdpi) Откройте второй вывод drawerlayout в качестве вспомогательного элемента drawerlayout за первый Как установить панель вкладок внизу в android? Прикрепить отладчик Eclipse для перезапуска приложения Android – внутреннее хранилище и внешнее хранилище, когда приложение установлено на SD-карте Как правильно удалить дополнение (или маржу?) Вокруг кнопок в Android? MultiAutoCompleteTextView с динамическими изменениями адаптера Android, как получить строку ответа от обратного вызова, используя OkHttp? Отключить keyGuard в Android 6.0 Измените layout_scrollFlags программно в CollapsingToolbarLayout

Использовать 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); 

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