Кто-нибудь может объяснить мне эти коды? Создание пользовательского элемента управления макетом - PullRequest
1 голос
/ 20 июня 2011

Может кто-нибудь объяснить мне эти коды, что именно они делают? Я не мог понять, как он добавляет две кнопки (ОК и Отмена). Я ожидаю некоторый код создания кнопки, например new Button() или что-то в этом роде. Он обращается к кнопкам с идентификатором, но в любом XML-файле нет кнопки с этими идентификаторами. Я просто вижу определение R.id.okcancelbar_ok в файле R.

Спасибо.

Оригинальный источник: http://developer.android.com/resources/articles/layout-tricks-merge.html

Исходный код: http://progx.org/users/Gfx/android/MergeLayout.zip

public class OkCancelBar extends LinearLayout {
    public OkCancelBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOrientation(HORIZONTAL);
        setGravity(Gravity.CENTER);
        setWeightSum(1.0f);
                LayoutInflater.from(context).inflate(R.layout.okcancelbar, this, true);
                TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.OkCancelBar, 0, 0);
                String text = array.getString(R.styleable.OkCancelBar_okLabel);
        if (text == null) text = "Ok";
        ((Button) findViewById(R.id.okcancelbar_ok)).setText(text);
                text = array.getString(R.styleable.OkCancelBar_cancelLabel);
        if (text == null) text = "Cancel";
        ((Button) findViewById(R.id.okcancelbar_cancel)).setText(text);
                array.recycle();
    }}

Ответы [ 2 ]

6 голосов
/ 20 июня 2011
LayoutInflater.from(context).inflate(R.layout.okcancelbar, this, true);

эта строка раздувает "this" с помощью макета R.layout.okcancelbar

((Button) findViewById(R.id.okcancelbar_ok)).setText(text)

это означает, что в макете okcancelbar есть кнопка с идентификатором "okcancelbar_ok" (завышено ранее) Далеемы присвоили ему текст "Ok"

((Button) findViewById(R.id.okcancelbar_cancel)).setText(text);

, как указано выше, в макете okcancelbar есть кнопка с идентификатором "okcancelbar_cancel"

Итак, этот код выполняет: 1) надутьпросмотреть R.layout.okcancelbar 2) получить кнопку (объявленную в предыдущем макете) с идентификатором «okcancelbar_ok» и установить текст «Ok» 3) то же самое с кнопкой «okcancelbar_cancel» и текстом «Cancel»

Макет "layout / okcancelbar.xml" должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <include
        layout="@layout/okcancelbar_button"
        android:id="@+id/okcancelbar_ok" />

    <include
        layout="@layout/okcancelbar_button"
        android:id="@+id/okcancelbar_cancel" />
</merge>

Также должен быть файл "values ​​/ attrs.xml", который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="OkCancelBar">
    <attr name="okLabel" format="string"/>
    <attr name="cancelLabel" format="string"/>
</declare-styleable>
</resources>

Инаконец, "layout / okcancelbar_button" должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Button
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/button"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">    
</Button>

Надеюсь, это поможет

0 голосов
/ 11 сентября 2011

Этого почти достаточно, чтобы превратить испорченный MergedLayout.zip в годный к использованию проект.

Было исправлено только 2 детали:

  1. В layout/okcancelbar_button.xml (название курса оканчивается на .xml),
    заменить wrap_content на fill_parent.При fill_parent одна из кнопок закрывает другую.

  2. Файл src/com/example/android/merge/R.java включен в MergedLayout.zip

Должен быть удален

...