Как установить количество кнопок при использовании InlineKeyboardBuilder в коде?

Как изменить класс InlineKeyboard таким образом, чтобы он добавлял каждую новую кнопку в InlineKeyboardBuilder на новой строке?
  • 4 декабря 2023 г. 22:19
Ответы на вопрос 2
Допустим, у вас есть класс `InlineKeyboardBuilder`, который используется для построения `InlineKeyboard` с кнопками в Telegram боте. Мы попробуем модифицировать класс так, чтобы каждая добавляемая кнопка шла на новой строке.

Прежде всего, учтите, что без исходного кода `InlineKeyboardBuilder`, я могу предложить только общий пример, который вы сможете адаптировать под свою реализацию.

`InlineKeyboardBuilder` может выглядеть примерно так:

```java
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup;

import java.util.ArrayList;
import java.util.List;

public class InlineKeyboardBuilder {
    private List<List<InlineKeyboardButton>> keyboard = new ArrayList<>();

    public InlineKeyboardBuilder addButton(InlineKeyboardButton button) {
        List<InlineKeyboardButton> row;
        if (keyboard.isEmpty()) {
            row = new ArrayList<>();
            keyboard.add(row);
        } else {
            // Получаем последний ряд кнопок
            row = keyboard.get(keyboard.size() - 1);
        }
        
        // Добавляем кнопку в ряд
        row.add(button);
        
        return this;
    }

    public InlineKeyboardBuilder addNewLineButton(InlineKeyboardButton button) {
        // Создаем новый ряд кнопок
        List<InlineKeyboardButton> newRow = new ArrayList<>();
        newRow.add(button);
        keyboard.add(newRow);

        return this;
    }

    public InlineKeyboardMarkup build() {
        InlineKeyboardMarkup markup = new InlineKeyboardMarkup();
        markup.setKeyboard(keyboard);
        return markup;
    }
}
```
В данном примере был добавлен метод `addNewLineButton`, который создает новый ряд в клавиатуре для каждой добавляемой кнопки.

Использование:

```java
InlineKeyboardButton buttonOne = new InlineKeyboardButton();
buttonOne.setText("Кнопка 1");
buttonOne.setCallbackData("callback_data_1");

InlineKeyboardButton buttonTwo = new InlineKeyboardButton();
buttonTwo.setText("Кнопка 2");
buttonTwo.setCallbackData("callback_data_2");

InlineKeyboardBuilder builder = new InlineKeyboardBuilder()
        .addNewLineButton(buttonOne) // Добавляем первую кнопку на новой строке
        .addNewLineButton(buttonTwo); // Добавляем вторую кнопку на новой строке

InlineKeyboardMarkup inlineKeyboard = builder.build();
```

В приведенном примере, когда вы вызываете `addNewLineButton`, в `keyboard` добавляется новый `List<InlineKeyboardButton>`, в который помещается одна кнопка. Таким образом, каждая кнопка будет на новой строке.

Если вы хотите изменить поведение кнопок так, чтобы **каждая добавляемая** кнопка автоматически шла на новой строке, модифицируйте метод `addButton`:

```java
// Метод добавления кнопки на новой строке автоматически
public InlineKeyboardBuilder addButton(InlineKeyboardButton button) {
    // Создаем новый ряд кнопок
    List<InlineKeyboardButton> newRow = new ArrayList<>();
    newRow.add(button);
    keyboard.add(newRow);

    return this;
}
```

Теперь каждый вызов метода `addButton` будет добавлять только одну кнопку в ряд и каждую такую строку в общий список `keyboard`.

Эти примеры кода могут отличаться от вашей специфической реализации `InlineKeyboardBuilder`, поэтому вам, возможно, придется адаптировать их под ваш конкретный случай.
def add_button(self, text, callback_data):
    button = types.InlineKeyboardButton(text=text, callback_data=callback_data)
    self.keyboard_markup.add(button)
    self.keyboard_markup.row()  # добавление новой строкиА вообще в доках все популярно расписано
Похожие вопросы