Помещение пользовательского представления в другое представление, используя макеты XML для обоих

1

Я начинаю работать над игрой, которая будет иметь 3 вида, уложенных друг на друга, в основном, логотип/рекламный ряд, ряд баллов и ряд игр. Для начала я пытаюсь создать класс под названием Level_Score_Bar, который использует XML-макет под названием score_bar_layout. Прямо сейчас мой основной XML-код выглядит так (обратите внимание, что я редактировал это, основываясь на приведенных ниже предложениях, если я его исправлю, я прекращу его редактировать):

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_height="fill_parent" android:layout_width="fill_parent">
    <LinearLayout android:layout_height="wrap_content" android:orientation="horizontal" android:layout_width="fill_parent" android:id="@+id/Title_bar">
        <ImageView android:layout_height="wrap_content" android:id="@+id/imageView1" android:layout_width="wrap_content" android:src="@drawable/icon"></ImageView>
        <LinearLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/linearLayout4">
        </LinearLayout>
    </LinearLayout>
    <pearsonartphoto.AJEG.Level_Score_bar android:layout_height="fill_parent" android:layout_width="wrap_content" android:id="@+id/Score_Bar">
    </pearsonartphoto.AJEG.Level_Score_bar>
    <LinearLayout android:layout_height="wrap_content" android:layout_width="fill_parent" android:orientation="vertical" android:id="@+id/Game_Row">
        <View android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/view3"></View>
    </LinearLayout>
</LinearLayout>

Уровень_Score_bar.java выглядит следующим образом:

public class Level_Score_bar extends RelativeLayout {
public Level_Score_bar(Context context, AttributeSet set, int defStyle) {
    this(context,set);
}

public Level_Score_bar(Context context, AttributeSet set) {
    super(context, set);
    this.addView(View.inflate(context,R.layout.score_bar_layout,null));
    Log.d(TAG,"Added view");
}
}

score_bar_layout.xml выглядит следующим образом

<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="wrap_content">
    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:text="@string/level" android:id="@+id/Level_text" android:layout_toRightOf="@+id/Level_text"></TextView>
    <TextView android:id="@+id/Current_Level" android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:layout_alignParentTop="true"></TextView>
    <TextView android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:layout_centerVertical="false" android:layout_centerHorizontal="true" android:id="@+id/Time_Left"></TextView>
    <TextView android:id="@+id/Score_Label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:text="@string/score"></TextView>
    <TextView android:layout_width="wrap_content" android:text="TextView" android:layout_height="wrap_content" android:layout_toRightOf="@+id/Score_Label" android:id="@+id/Score_Value"></TextView>
</RelativeLayout>

Проблема в том, что я вообще не вижу представления. Я уверен, что мне не хватает чего-то маленького, но я не могу, чтобы жизнь меня поняла. Я подтвердил, что команда addView вызывается (через оператор Log.d), но это просто не имеет никакого значения...

Теги:
android-layout
android-xml

4 ответа

5
Лучший ответ

Вы используете неправильный конструктор, если я правильно помню, попробуйте вместо этого:

public Level_Score_bar(Context context, AttributeSet set, int defStyle) {
    super(context, set, defStyle);
    // ... 
}

[Изменить] Забыл упомянуть, что, поскольку вы создаете представление из XML, Android вызывается этим конструктором, а также позволяет использовать пользовательские атрибуты, если вы этого пожелаете.

  • 0
    Оказывается, похоже, что правильный ответ - 2 уровня. Кроме того, это все еще не исправляет пустоту, которую я вижу, но я дам вам +1.
1

Это так просто, я чувствую себя идиотом...

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

1

Я не уверен, что вы пытаетесь сделать, добавьте некоторые детали: имя файла xml ваши намерения, то, что вы хотите сделать именно с обоими.

Но вот несколько общих советов:

Переопределите другие конструкторы и в пользовательских классах просмотра. Один параметр аргумента предназначен для загрузки класса из кода, второго аргумента атрибута набора, он будет использоваться для конструкций xml.

Когда вы ссылаетесь на пользовательский компонент (дочерний элемент) в xml (родительский), используйте полное имя класса вашего дочернего класса. (который будет загружать дочерний макет). полное имя пакета + имя класса

С уважением, Стефан

  • 0
    Как мне сообщить дочернему классу, каким должен быть его макет?
  • 0
    Не берите в голову ... Но я дам вам один плюс, так как я использовал часть этого совета.
Показать ещё 1 комментарий
0

Вы пытались позвонить?

this.addView(View.inflate(getContext(),R.layout.score_bar_layout,null));
  • 0
    Да, не работал ...
  • 0
    также вы пытались заменить getContext () с контекстом, который вы получаете от конструктора?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню