Как программно добавить контент в пользовательский макет XML? - PullRequest
1 голос
/ 03 ноября 2011

Я делаю собственный XML-макет для отображения рецепта коктейля. Вот мой XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:id="@+id/drinkname" android:layout_height="wrap_content"
    android:textSize="30sp" android:text="@string/drink_name"
    android:layout_width="wrap_content" android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<TextView android:layout_width="fill_parent"
    android:layout_height="2dp" android:background="#FFFFFFFF"
    android:layout_below="@id/drinkname" />

<TextView android:layout_height="wrap_content" android:id="@+id/ingredient_label"
    android:text="Ingredients: " android:layout_width="wrap_content"
    android:layout_below="@+id/drinkname" android:layout_marginLeft="10dp"
    android:layout_marginTop="16dp" />
<TableLayout android:layout_height="wrap_content"
    android:id="@+id/ingredient_table" android:layout_width="wrap_content"
    android:layout_alignTop="@+id/ingredient_label"
    android:layout_alignLeft="@+id/drinkname"
    android:layout_alignParentRight="true">
    <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    <TextView android:text="• 2 oz. Gin (Boodles)"android:id="@+id/textView1"
        android:layout_width="wrap_content" 
                android:layout_height="wrap_content" />
    </TableRow>
    <TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView android:text="• 2 oz. Vodka (Stolichnaya)"
            android:id="@+id/textView2" android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </TableRow>
    <TableRow android:id="@+id/tableRow3" android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView android:text="• 1/2 oz. Vermouth, dry" android:id="@+id/textView3"
            android:layout_width="wrap_content" android:layout_height="wrap_content" />
    </TableRow>
    <TableRow android:id="@+id/tableRow4" android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView android:text="• 3 pieces Olive" android:id="@+id/textView4"
            android:layout_width="wrap_content" android:layout_height="wrap_content" />
    </TableRow>
</TableLayout>

<TextView android:id="@+id/instruction_label"
    android:layout_height="wrap_content" android:layout_width="wrap_content"
    android:layout_below="@id/ingredient_table" android:layout_alignLeft="@id/ingredient_label"
    android:text="Instructions: " android:layout_marginTop="25dp" />
<TextView android:id="@+id/instructions"
    android:layout_height="wrap_content" android:layout_width="wrap_content"
    android:layout_alignTop="@id/instruction_label"
    android:layout_alignLeft="@id/drinkname"
    android:layout_alignParentRight="true" android:text="@string/drink_instructions" />

<TextView android:id="@+id/glass_label" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:layout_below="@id/instructions"
    android:layout_alignLeft="@id/ingredient_label" android:text="Glass:"
    android:layout_marginTop="25dp" />
<TextView android:id="@+id/glass_type"
    android:layout_toRightOf="@id/glass_label" android:text="@string/drink_glass"
    android:layout_height="wrap_content" android:layout_width="wrap_content"
    android:layout_alignTop="@id/glass_label" android:layout_alignLeft="@+id/drinkname" />

Как видите, весь отображаемый контент записан в самом макете или взят из строкового ресурса. Мой вопрос: что мне нужно сделать, чтобы сохранить макет, который я создал ниже, но иметь возможность заполнять контент программно?

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Тебе придется сделать что-то вроде этого ...

(TextView) this.findViewById(R.id.drinkname).setText("Water");

Используйте findView, чтобы получить ссылку на конкретный вид деятельности. Передайте ему идентификатор ресурса, который вы дали в XML (свойство id). Приведите его к правильному типу просмотра, а затем установите его свойства.

Идентификаторы ресурсов создаются автоматически из атрибута id в XML и добавляются в класс R внутри R.id..

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

TextView tvGameDate;
TextView tvGameTime;
TextView tvHomeTeam;
TextView tvAwayTeam;
TextView tvHomePitcher;

Затем, ближе к началу onCreate, я заполнил их всех ссылками на активные представления, например так:

tvGameDate = (TextView) this.findViewById(R.id.tvGameDate);
tvGameTime = (TextView) this.findViewById(R.id.tvGameTime);
tvHomeTeam = (TextView) this.findViewById(R.id.tvHomeTeam);
tvAwayTeam = (TextView) this.findViewById(R.id.tvAwayTeam);
tvHomePitcher = (TextView) this.findViewById(R.id.tvHomePitcher);

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

tvHomeTeam.setText(attributes.getNamedItem("home_long").getNodeValue());
tvHomePitcher.setText(" (" + attributes.getNamedItem("home_pitcher").getNodeValue() + ")");

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

TextView tv = new TextView(context);

tv.setTextColor(Color.BLACK);
tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
tv.setText("Some text for the new view");
llIngredients.addView(tv);
1 голос
/ 03 ноября 2011

Не уверен, что я следую за тобой.Я предполагаю, что этот ресурс представляет деятельность.Вы можете получить ссылку на текстовое представление, скажем, glass_type, сказав -

TextView glassTypeTxtView = findViewById(R.id.glass_type), и динамически установить его содержимое, сказав glassTypeTxtView.setText("new text").

Пожалуйста, поправьте меня, если я полностью не понял ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...