Notheros
Notheros

Reputation: 2247

Incorrect alignment creating button in Java vs XML

I have this XML:

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/button_bar"
                style="?android:buttonBarStyle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

            <Button
                 style="?android:attr/borderlessButtonStyle"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
                 android:layout_gravity="center"
                 android:gravity="center"
                 android:textColor="@color/md_green_400" />

            <Button
                 android:id="@+id/action_button"
                 style="?android:attr/borderlessButtonStyle"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
                 android:layout_gravity="center"
                 android:gravity="center"
                 android:textColor="@color/md_green_400" />
  </LinearLayout>

It´s just a buttonBar with two borderless buttons. It works. However, I don't want that, I need to inflate these buttons from a JSONArray. So I did this:

   for (int b = 0; b < buttons.length(); b++) {
                    final JSONObject button = buttons.getJSONObject(b);
                    LinearLayout buttonBar = (LinearLayout) child.findViewById(R.id.button_bar);
                    View buttonChild = getLayoutInflater().inflate(R.layout.flat_button, null);
                    Button action = (Button) buttonChild.findViewById(R.id.action_button);
                    action.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {}
                    });
                    action.setText(button.getString("descricao"));
                    action.setTextColor(Color.parseColor(button.getString("text_color")));
                    buttonBar.addView(buttonChild);
   }

It works too, but the buttons get a left alignment. I want they justified. Why it works when I let them fixed but not when I inflate them?

OBS: The "button_bar" is A XML just with a LinearLayout and the "ActionButton" is just a XML with a Button.

Upvotes: 0

Views: 40

Answers (1)

Kevin Coppock
Kevin Coppock

Reputation: 134714

This is the root of your problem:

View buttonChild = getLayoutInflater().inflate(R.layout.flat_button, null);

If you don't provide the parent view to the inflate() method, any LayoutParams attributes (e.g. layout_gravity) will be discarded since the parent is the one to interpret those attributes.

You can fix this by changing it to:

View buttonChild = getLayoutInflater().inflate(
        R.layout.flat_button, buttonBar, false);

Which will give it the parent you're attaching it to, but not attach it to the hierarchy yet (you do that below with addView()).

Upvotes: 1

Related Questions