Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create android buttons programmatically using XML layout as template

I have a LinearLayout that contains a TextView, and always will. There will also always be at least one button located below the TextView, but there might be more than one under certain circumstances.

I can successfully create and add as many buttons as I need programmatically. I can also successfully set whatever appearance related parameters/options that I require for these buttons programmatically.

The problem is that I don't know how to tell a programmatically created button that it should use a XML resource file, which contains the appearance and layout parameters, instead of setting these parameters programmatically.

I've looked at similarly named questions and spent time messing with the API itself, to no avail.

Edit:
Here's an approximation of what I'm trying to do that will hopefully make explanations a bit clearer for me:

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;
}

My XML layout file for the fragment looks like this (It's this LinearLayout that I'm trying to add buttons to):

<?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>

Also, if I'm to create an XML layout file for the button (lets call it custom_button.xml) should it look something like this?:

<?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... />

Update:
Just to expand a bit on what MrFox@ is talking about, what I did to get it working was replace this line:

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

with this one:

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

...which inflates an xml file containing only a Button layout (the button template). In this case, it returns the root view of that file, which is just the button because there's no parent above the button in the file.

However, if I had have set the last boolean value (attachToParent) to true, it would have returned the root container that the button will be in (which is just the 'layout' variable that was passed into the call).

I can now produce as many buttons as I want using this template.

like image 828
Rob Avatar asked Sep 14 '12 17:09

Rob


2 Answers

Have you thought of making a layout that is just the button with the applied XML styles and then inflating it into your linear layout?

something like:

inflater.inflate(R.layout.StyledButton, MyLinearLayout, true);

like image 128
chris-tulip Avatar answered Sep 19 '22 13:09

chris-tulip


xml for your button under /res/layout/my_button_layout.xml

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

code in your activity

myButton = (Button)inflate.inflate(R.layout.my_button_layout, null);
myView.addView(myButton);
like image 29
Aray Karjauv Avatar answered Sep 20 '22 13:09

Aray Karjauv