Я не могу принести красивые пуговицы

как создать массив таких кнопок???

btnA btnB btn1 btnC
btnD btnE btnF btnJ
     btnX btnN

Я делаю так, но кнопки отображаются вертикально. может кто подскажет алгоритм?

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TableLayout;

public class MyActivity extends Activity {
    /**
     * Called when the activity is first created.
     */
   TableLayout layout;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         layout = (TableLayout) findViewById(R.id.lay);
         TableLayout.LayoutParams layoutParams = new
        TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT,
        TableLayout.LayoutParams.WRAP_CONTENT);
        for(int i = 0; i < 12; i++){
            Button button = new Button(this);
            button.setLayoutParams(layoutParams);
            button.setId(i);
            button.setText("Buttun"+i);
            layout.addView(button,50,20);
        }
    }
    }

person user2954895    schedule 26.02.2014    source источник
comment
Используйте XML с RelativeLayout и размещайте эти кнопки путем перетаскивания. А затем раздуйте этот макет и используйте его в своем приложении.   -  person Aman Agnihotri    schedule 26.02.2014
comment
Мне нужно создавать динамически. Потому что кнопок много, и мне нужно обрабатывать их события.   -  person user2954895    schedule 26.02.2014
comment
Затем используйте GridView.   -  person Aman Agnihotri    schedule 26.02.2014
comment
Вам не хватает строк таблицы: stackoverflow.com/a/13988763/995891   -  person zapl    schedule 26.02.2014
comment
Используйте GridLayout. Я думаю, что он доступен с уровня API 14, но у него есть поддержка совместимости.   -  person gunar    schedule 26.02.2014
comment
Лучше всего использовать GridLayout.   -  person Piyush    schedule 26.02.2014


Ответы (4)


Вы можете использовать вертикальный LinearLayout с горизонтальными дочерними элементами, содержащими кнопки.

android:layout_width="0dp"
android:layout_weight="1"

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/button1"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button2"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button3"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button4"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="Button" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/button5"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button6"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button7"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button8"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="Button" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <View
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/button9"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button10"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="Button" />

        <View
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content" />

    </LinearLayout>

</LinearLayout>
person Yaroslav Mytkalyk    schedule 26.02.2014
comment
Я могу взять и поставить кнопку на экран, как мне нужно. Но я хочу сделать это в коде! - person user2954895; 26.02.2014

динамически вы хотите добавить кнопку,

грубая идея,

создать один main linear layout с vertical orientation.

и sublayout1 с horizontal orientation с макетом gravity center.

и sublayout2 с горизонтальной ориентацией с центром тяжести макета.

и sublayout3 с горизонтальной ориентацией с центром тяжести макета.

и sublayout4 с горизонтальной ориентацией с центром тяжести макета.

добавить кнопку на

тогда

sublayout1.add(btn1)
sublayout1.add(btn2)
sublayout1.add(btn3)
sublayout1.add(btn4)

mainliniarlayout.add(sublayout)

аналогично добавьте другую кнопку и макет.

для динамического добавления кнопки читайте ниже ветку,

Как я могу динамически создать кнопку в Android?

person Community    schedule 26.02.2014

Вы должны создать 3x TableRows в файле TableLayout. И поместите свои кнопки в эти ряды. Ознакомьтесь с этим учебником по макету таблицы.

Как бы то ни было, вы просто неправильно используете TableLayout. Так что можно увидеть практически все.

Я выполнил действие, которое создало большую таблицу вещей два года назад.

Посмотрите на код здесь

/**
 * the current row of the currently selected element (starting by 0)
 * @return
 */
int currentRow(int position) {
    int numOnPage = position - leftTopNumber;
    return numOnPage - currentColumn(position) * rowsNumber;
}

/**
 * the current column of the currently selected element (starting by 0)
 * @return
 */
int currentColumn(int position) {
    int numOnPage = position - leftTopNumber;
    return numOnPage / rowsNumber;
}

/**
 * setting width and height for a ViewGroup instance
 * @param viewGroup instance to be changed
 * @param width if it is 0, the ViewGroup instance width remains as it was
 * @param height if it is 0, the ViewGroup instance height remains as it was
 */
static void setMeasures(ViewGroup viewGroup, int width, int height) {
    LayoutParams params = viewGroup.getLayoutParams();
    if (width != 0) params.width = width;
    if (height != 0) params.height = height;
    viewGroup.setLayoutParams(params);
}

@Override
public void onResume() {
    super.onResume();
}

static private LinearLayout table;
static private TextView leftTriangle, rightTriangle;

boolean fillTableByCells() {
    int i = 0, j = 0;
    try {
        final LayoutInflater inflater =
                (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        setContentView(R.layout.channels_list_table);
        LinearLayout allForm = (LinearLayout) findViewById(R.id.AllChannelsListForm);

        LinearLayout upperMargin = (LinearLayout) findViewById(R.id.UpperMargin);
        LinearLayout middleStripe = (LinearLayout) findViewById(R.id.MiddleStripe);
        LinearLayout bottomMargin = (LinearLayout) findViewById(R.id.BottomMargin);

        RelativeLayout leftMargin = (RelativeLayout) findViewById(R.id.LeftMargin);
        LinearLayout tableWrapper = (LinearLayout) findViewById(R.id.CentralFieldWrapper);
        RelativeLayout rightMargin = (RelativeLayout) findViewById(R.id.RightMargin);

        tvComposeNumber = (TextView) findViewById(R.id.tvComposeNumber);

        leftTriangle = (TextView) findViewById(R.id.TriangleLeft);
        rightTriangle = (TextView) findViewById(R.id.TriangleRight);

        table = (LinearLayout) findViewById(R.id.table_channels);

        allForm.measure(0, 0);
        int formWidth = allForm.getWidth();
        int formHeight = allForm.getHeight();

        formWidth = 960;
        formHeight = 540;

        int heightUpper = formHeight * 66 / 570;
        int heightMiddle = formHeight * 410 / 570;
        int heightBottom = formHeight * 94 / 570;

        int widthLeft = formWidth * 60 / 1140;
        int widthMiddle = formWidth * 1020 / 1140;
        int widthRight = formWidth * 60 / 1140;

        setMeasures(allForm, formWidth, formHeight);

        setMeasures(upperMargin, formWidth, heightUpper);
        setMeasures(middleStripe, formWidth, heightMiddle);
        setMeasures(bottomMargin, formWidth, heightBottom);

        setMeasures(leftMargin, widthLeft, heightMiddle);
        setMeasures(tableWrapper, widthMiddle, heightMiddle);
        setMeasures(rightMargin, widthRight, heightMiddle);

        LinearLayout.LayoutParams wrapperLP =
                (LinearLayout.LayoutParams) tableWrapper.getLayoutParams();
        LinearLayout.LayoutParams tableLP = (LinearLayout.LayoutParams) table.getLayoutParams();
        int widthInsideTable =
                widthMiddle - wrapperLP.leftMargin - wrapperLP.rightMargin
                        - tableWrapper.getPaddingLeft() - tableWrapper.getPaddingRight()
                        - tableLP.leftMargin - tableLP.rightMargin - table.getPaddingLeft()
                        - table.getPaddingRight();

        // setMeasures(table,widthMiddle,heightMiddle);
        cellsNumber = TvChannel.list.size();

        columnsNumber = (cellsNumber - 1) / rowsNumber + 1;

        for (i = 0; i < columnsNumber; i++) {
            LinearLayout column =
                    (LinearLayout) inflater
                            .inflate(R.layout.channels_list_column, table, false);
            table.addView(column, i);

            for (j = 0; j < rowsNumber; j++) {
                int numberChannel = i * rowsNumber + j;
                if (numberChannel >= TvChannel.list.size()) break;
                LinearLayout cell =
                        (LinearLayout) inflater.inflate(R.layout.channels_list_cell, column,
                                false);
                column.addView(cell, j);

                TextView numberChannelView = (TextView) cell.getChildAt(0);
                TextView nameChannelView = (TextView) cell.getChildAt(1);

                nameChannelView.setText(TvChannel.list.get(numberChannel).name);
                String numberString = String.format("%d", i * rowsNumber + j);
                numberChannelView.setTextSize(new float[] { 22f, 20f, 17f }[numberString
                        .length() - 1]);
                numberChannelView.setText(numberString);
                cell.setVisibility(View.VISIBLE);
            }
            // column.setLayoutParams(new
            // LayoutParams(tableWidth/3,LayoutParams.MATCH_PARENT));

            LinearLayout.LayoutParams columnLP =
                    (LinearLayout.LayoutParams) column.getLayoutParams();
            int colWidth =
                    widthInsideTable / maxSeenColumns - columnLP.leftMargin
                            - columnLP.rightMargin;
            setMeasures(column, colWidth, LayoutParams.MATCH_PARENT);

            for (int iCell = 0; iCell < column.getChildCount(); iCell++) {
                LinearLayout cell = (LinearLayout) column.getChildAt(iCell);
                setMeasures(cell, LayoutParams.MATCH_PARENT,
                        (heightMiddle - column.getPaddingBottom() * 2) / rowsNumber);
            }

        }
        return true;
    }
    catch (Throwable e) {
        ErrorMessage.outputMessageByName("channels_list_activity_create", this, e.toString()
                + "; column=" + i + "; row=" + j);
        finish();
        return false;
    }
}
person Gangnus    schedule 26.02.2014
comment
Кнопок может быть 70, 71 или 77. Кто-нибудь может поделиться кодом для примера, пожалуйста? - person user2954895; 26.02.2014
comment
@ user2954895 Что такое 77? Количество кнопок? Или текст на кнопках? - person Gangnus; 26.02.2014
comment
Количество кнопок. текст на кнопках - A B C D ... Z - person user2954895; 26.02.2014
comment
@user2954895 user2954895 посмотрите на выпуск, этот код наверняка покрывает вашу проблему и поможет избежать некоторых проблем, которых вы еще не видите. - person Gangnus; 26.02.2014

Спасибо вам всем! Подумал и решил сделать не динамично (хотя мне кажется что долго). Мне нужно только две азбуки, так что, наверное, не будет извращаться.

person user2954895    schedule 26.02.2014
comment
Это не ответ, а комментарий, так что не делайте этого. - person keshav; 26.02.2014