Как раздуть расширенный LinearLayout из XML

Кто-нибудь может предложить способ улучшить этот пример API8? Хотя они говорят, что представления могли быть определены в XML, на самом деле они закодировали их в java. Я понимаю, почему они этого хотели. Они добавили некоторые элементы в расширенный LinearLayout, и значения определяются во время выполнения.

По мнению всех во вселенной, директивы макета должны быть переведены в XML. Но для этого приложения имеет смысл продолжать устанавливать текст как есть в логике времени выполнения. Итак, у нас есть гибридный подход. Раздуйте представления, затем заполните динамический текст. Мне трудно понять, как это сделать. Вот источник и то, что я пробовал.

из Примеры API8, List4. Java

  private class SpeechView extends LinearLayout {
     public SpeechView(Context context, String title, String words) {
        super(context);

        this.setOrientation(VERTICAL);

        // Here we build the child views in code. They could also have
        // been specified in an XML file.

        mTitle = new TextView(context);
        mTitle.setText(title);
        ...

Я подумал, что поскольку LinearLayout имеет android:id="@+id/LinearLayout01", я смогу сделать это в OnCreate.

SpeechView sv = (SpeechView) findViewById(R.id.LinearLayout01);

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

    public class SpeechView extends LinearLayout {
       public SpeechView(Context context) {
          super(context);
          System.out.println("Instantiated SpeechView(Context context)");
       }
       ...

person yetimoner    schedule 03.01.2011    source источник


Ответы (2)


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

public class SpeechView extends LinearLayout {
        public SpeechView(Context context) {
           super(context);
           View.inflate(context, R.layout.main_row, this);
        }
        ...

Я буду рад услышать, повезет ли вам с этим.

Изменить: теперь это работает для меня так же, как это.

person Kevin Worth    schedule 04.01.2011

Похоже, вы раздули свой макет, который находится в файле main_row.xml. Правильный? Моя потребность в другом. Я хочу раздуть дочерний элемент TextView макета, который у меня есть в main.xml.

Тем не менее, я использовал подобное решение. Так как я уже раздул LinearLayout из XML в onCreate

setContentView(R.layout.main);

осталось раздуть TextView из XML в моем конструкторе View. Вот как я это сделал.

LayoutInflater li = LayoutInflater.from(context);
LinearLayout ll = (LinearLayout) li.inflate(R.layout.main, this);
TextView mTitle = (TextView) ll.findViewById(R.id.roleHeading);

R.id.roleHeading — это идентификатор TextView, который я надуваю.

<TextView android:id="@+id/roleHeading" ... />

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

person yetimoner    schedule 07.01.2011