Создавайте кнопки Android программно, используя макет XML в качестве шаблона

У меня есть LinearLayout, который содержит TextView, и всегда будет. Также всегда будет по крайней мере одна кнопка, расположенная под TextView, но при определенных обстоятельствах их может быть больше одной.

Я могу успешно создать и добавить столько кнопок, сколько мне нужно программно. Я также могу программно установить любые параметры/параметры, связанные с внешним видом, которые мне нужны для этих кнопок.

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

Я просмотрел вопросы с похожими названиями и потратил время на сам API, но безрезультатно.

Изменить:
Вот пример того, что я пытаюсь сделать, что, надеюсь, сделает пояснения для меня более понятными:

private TextView textView;
private SomeObject someObject;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) {
    View scrollView = inflater.inflate(R.layout.fragment_play_game, container, false);
    textView = (TextView) scrollView.findViewById(R.id.game_data_text);
    textView.setText(someObject.getTextForTextView());

    LinearLayout layout = (LinearLayout) scrollView.findViewById(R.id.game_data_container);
    for (String optionText : someObject.getTextForButtons()) {
        layout.addView(createOptionButton(optionText, layout));
    }
    return scrollView;
}

private View createOptionButton(String optionText, LinearLayout layout) {
    Button optionButton = new Button(this.getActivity());
    // set button layout/options here, somehow??
    optionButton.setText(optionText);
    return optionButton;
}

Мой файл макета XML для фрагмента выглядит так (это LinearLayout, к которому я пытаюсь добавить кнопки):

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/game_data_container"
        etc... >

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

    </LinearLayout>

</ScrollView>

Кроме того, если мне нужно создать XML-файл макета для кнопки (давайте назовем его custom_button.xml), он должен выглядеть примерно так?:

<?xml version="1.0" encoding="utf-8"?>
    <Button xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/play_game_option_button"
        etc... />

Обновление:
Просто чтобы немного расширить то, о чем говорит MrFox@, я сделал, чтобы заставить его работать, заменив эту строку:

Button optionButton = new Button(this.getActivity());

с этим:

Button optionButton = (Button) inflater.inflate(R.layout.play_game_option_button, layout, false);

... который раздувает XML-файл, содержащий только макет кнопки (шаблон кнопки). В этом случае он возвращает корневой вид этого файла, который является просто кнопкой, потому что над кнопкой в ​​файле нет родителя.

Однако, если бы я установил для последнего логического значения (attachToParent) значение true, он бы вернул корневой контейнер, в котором будет находиться кнопка (это всего лишь переменная макета, которая была передана в вызов).

Теперь я могу создать столько кнопок, сколько захочу, используя этот шаблон.


person Rob    schedule 14.09.2012    source источник


Ответы (2)


Вы думали о том, чтобы сделать макет, который представляет собой просто кнопку с примененными стилями XML, а затем раздуть его в свой линейный макет?

что-то типа:

inflater.inflate(R.layout.StyledButton, MyLinearLayout, правда);

person chris-tulip    schedule 14.09.2012
comment
Спасибо за ответ, я пытался поиграть с тем, что вы предлагаете, но я действительно не понимаю, как реализовать то, что вы предлагаете. Я обновил свой исходный вопрос с дополнительной информацией. - person Rob; 14.09.2012
comment
Спасибо @Rob за расширение моего ответа! - person chris-tulip; 25.12.2012
comment
Это отлично работает, так как мне нужно было установить кучу различных атрибутов, которые проще определить в файле xml, чем программно. - person Sepui; 13.02.2013

xml для вашей кнопки под /res/layout/my_button_layout.xml

<Button xmlns:android="http://schemas.android.com/apk/res/android"
   ... />

код в вашей деятельности

myButton = (Button)inflate.inflate(R.layout.my_button_layout, null);
myView.addView(myButton);
person Aray Karjauv    schedule 19.03.2016