Почему CheckBox расположен ниже Button?

Почему кнопки размещаются поверх CheckBox, даже несмотря на то, что я добавляю их в FrameLayout после кнопок? Я понимаю, что использование LinearLayout могло бы решить проблему, но я предпочитаю сохранить стиль с закругленными кнопками. Я проверил XML код, и он должен работать... Кажется, должно быть так: <br/> <pre><code class="java">// Функция для создания кнопок категорий
    private void createCategoryButtons(ArrayList&lt;String&gt; categories, LinearLayout listBottom, LinearLayout ListBottomUsers) {

        createExpandableButton("NGSL", new String[]{"NGSL 1-100", "NGSL 101-1000", "NGSL 1001 - 3000"}, listBottom);
        createExpandableButton("OXFORD", new String[]{"OXFORD 3000 - A1", "OXFORD 3000 - A2", "OXFORD 3000 - B1", "OXFORD 3000 - B2", "OXFORD 5000 - B2", "OXFORD 5000 - C1"}, listBottom);

        for (String categoryName : categories) {

            if (categoryName.contains("NGSL") || categoryName.contains("Oxford")) {
                continue;
            }
            FrameLayout myLinearLayout = new FrameLayout(getContext());
            myLinearLayout.setLayoutParams(new FrameLayout.LayoutParams(
                    FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT));

            // Создаем чекбокс
            CheckBox checkBox = new CheckBox(getContext());
            // Установка параметров макета для чекбокса
            checkBox.setLayoutParams(new FrameLayout.LayoutParams(
                    140,
                    140, Gravity.END | Gravity.CENTER_VERTICAL));
            FrameLayout.LayoutParams checkBoxParams = (FrameLayout.LayoutParams) checkBox.getLayoutParams();
            checkBox.setLayoutP
  • 26 сентября 2024 г. 2:53
Ответы на вопрос 1
Проблема в том, что вы используете `FrameLayout`, который по умолчанию накладывает дочерние элементы друг на друга, что приводит к тому, что последний добавленный элемент будет располагаться поверх предыдущих. Это может объяснять, почему кнопки располагаются поверх `CheckBox`, даже если вы добавляете их в коде после чекбоксов.

Чтобы решить эту проблему, есть несколько способов:

1. **Использование `LinearLayout`**: Это самое простое решение. `LinearLayout` размещает дочерние элементы по вертикали или горизонтали, что поможет избежать наложения элементов.

2. **Размещение элементов в `ConstraintLayout`**: Если вы хотите сохранить возможность использовать сложные макеты и позиционирование, вы можете рассмотреть возможность использования `ConstraintLayout`, который намного более гибок, чем `FrameLayout`, и позволит вам точно контролировать расположение каждого элемента.

3. **Использование `RelativeLayout`**: Если вы не хотите переключаться на `LinearLayout`, вы можете использовать `RelativeLayout`, который позволяет вам устанавливать относительные позиции дочерних элементов.

Если вам действительно нужно использовать `FrameLayout` и вы хотите настроить порядок отображения элементов, вы можете попробовать изменить порядок добавления элементов или задать правила видимости, но это может быть сложнее и не всегда будет удобным решением.

Пример изменения `FrameLayout` на `LinearLayout`:

```java
LinearLayout myLinearLayout = new LinearLayout(getContext());
myLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
myLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.WRAP_CONTENT));

// Создаем чекбокс
CheckBox checkBox = new CheckBox(getContext());
checkBox.setLayoutParams(new LinearLayout.LayoutParams(
        140,
        LinearLayout.LayoutParams.WRAP_CONTENT));
myLinearLayout.addView(checkBox);

// Создаем кнопку
Button button = new Button(getContext());
button.setLayoutParams(new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.WRAP_CONTENT,
        LinearLayout.LayoutParams.WRAP_CONTENT));
button.setText("Кнопка");
myLinearLayout.addView(button);

// Добавляем в основной контейнер
listBottom.addView(myLinearLayout);
```

Если вы решите остаться с `FrameLayout` и хотите, чтобы чекбоксы находились ниже кнопки, вам нужно отрегулировать использование `LayoutParams`, добавив необходимое смещение. Однако, как уже упоминалось, `LinearLayout` будет более подходящим выбором для таких случаев.
Похожие вопросы