Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361

Layout для кнопки

20.06.2017, 23:33. Показов 1850. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Добавляю кнопки программно через new MyButton. Можно как то создать отдельно loayot.xml где описать внешний вид, а потом добавить его, например, кнопке в конструкторе? Просто так кажется наглядно дизайн кнопке делать
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2017, 23:33
Ответы с готовыми решениями:

4 кнопки и layout
Всем. Перечитал много разных тем на stackoverflow, там столько советов и советчиков, что голова пухнет. Большая часть советов о том,...

Как изменять текст в layout c кнопки?
Как изменять текст в listView c помощью кнопки, прямо в приложении Например:в apk приложении listView список. Нажимаем на неё...

Как растянуть 3 кнопки по ширине layout?
Вот 3 кнопки, которые нужно растнуть? чтоб они были одинаковой ширины и заняли всю ширину layout Где и какой параметр...

16
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
21.06.2017, 10:24
Java
1
2
View view = getLayoutInflater().inflate(R.layout.new_button, null);
Button button = (Button) view.findViewById(R.id.button);
Добавлено через 57 секунд
Например, так, можно и короче сделать.
1
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
21.06.2017, 11:12  [ТС]
ExFau$t,
Не очень понял. А откуда я возьму id кнопки?
Я имел в виду что у меня есть класс MyButton extends Button.
А в коде я создаю:
MyButton button = new MyButton();
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
21.06.2017, 11:20
Цитата Сообщение от werrt Посмотреть сообщение
создать отдельно loayot.xml где описать внешний вид, а потом добавить его
Рисуешь кнопку и "добавляешь".
1
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
21.06.2017, 12:32  [ТС]
проблема в том, что я не понимаю как его добавить в кнопку:
<?xml version="1.0" encoding="utf-8"?>
Java
1
2
3
4
5
6
7
<Button xmlns:android="http://schemas.android.com/apk/res/android"
 
  android:layout_height="wrap_content"
  android:background="@drawable/bg"
  android:layout_width="wrap_content">
 
</Button>
у меня в цикле создаются кнопки:

Java
1
2
3
4
5
  for (int i = 0; i < 5; i++) {
            MyButton button = new MyButton(holder.itemView.getContext());
         
            holder.linearLayout.addView(button); //здесь кнопку добавляю в holder
        }
как в конструкторе или в цикле вставить дизайн кнопки?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.06.2017, 12:48
та шо там добавлять
вот активити, минимальный код для демонстрации, container - это просто лаяут в который надо добавить кнопку
Java
1
2
3
4
5
6
7
8
9
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        FrameLayout layout = (FrameLayout) findViewById(R.id.container);
        View.inflate(this, R.layout.mybutton_layout, layout);
 
    }
вот кнопка, ничего особенного
Java
1
2
3
4
5
6
7
8
9
10
public class MyButton extends android.support.v7.widget.AppCompatButton {
 
    public MyButton(Context context) {
        super(context);
    }
 
    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}
и разметка для кнопки, там разукрашиваем как хотим, хоть text заранее задавай
XML
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<company.myapplication.MyButton xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:backgroundTint="@color/colorAccent"
    android:text="123"
    android:textColor="#fff"/>
1
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
21.06.2017, 13:19  [ТС]
Pablito, сделал так

View.inflate(button.getContext(),R.layou t.my_button,holder.linearLayout);

сработало, но почему нужно через View.inflate , а не через addView() ?

и почему то получается просто кнопка, без текста, т.е. setText не срабатывает
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.06.2017, 13:38
это вообще разные методы
addView просто добавляет в какой-нибудь ляут созданную вьюшку

а View.inflate сразу "выдувает" в этом ляуте вьюшку по "шаблону"-разметке, которую мы передаем вторым параметром
и в этом случае атрибуты типа layout_bla_bla не теряются

если делать НЕ через View.inflate то все равно перед addView нам надо как-то создать эту вьюшку...гимор начинается когда ее надо не просто создать, а и применить стиль, а потом еще и добавлять addView(button, new LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
я не знаю как проще объяснить

Цитата Сообщение от werrt Посмотреть сообщение
и почему то получается просто кнопка, без текста, т.е. setText не срабатывает
потому что не нужно кнопку создавать до View.inflate
ее теперь надо либо брать из лаяута куда мы ее добавили, либо переписать вообще иначе, но придется применять LayoutParams

типа такого
Java
1
2
3
4
        FrameLayout layout = (FrameLayout) findViewById(R.id.container);
        Button button = (Button) View.inflate(this, R.layout.mybutton_layout, null); // ахтунг, последний параметр null, это значит кнопка не будет добавлена в лаяут, ее надо самому добавить, ниже код
        button.setText("777777");
        layout.addView(button, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
1
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
21.06.2017, 14:16  [ТС]
Pablito,
Button button = (Button) View.inflate(this, R.layout.mybutton_layout, null);
но не могу привести к свой MyButton
MyButton button = (MyButton) View.inflate(this, R.layout.mybutton_layout, null);
вылетает cast exeption
а в MyButton нужные мне доп. поля.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.06.2017, 14:17
что в mybutton_layout ?
0
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
21.06.2017, 14:24  [ТС]
Pablito,
<?xml version="1.0" encoding="utf-8"?>
Java
1
2
3
4
5
6
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
      android:background="@drawable/logo"
    android:textColor="@color/colorAccent">
</Button>
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.06.2017, 14:29
так я ж приводил пример, там в разметке надо указывать не Button а свой класс
0
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
21.06.2017, 14:34  [ТС]
Pablito,
я так и пытался, но получил
android.view.InflateException: Binary XML file line #2: Error inflating class info.upump.upupmapp.entity.MyButton
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.06.2017, 14:38
разметку кнопки нормальную, с указанием своего класса + лог ошибки + код класса кнопки + кусок кода где кнопка инфлейтится
0
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
21.06.2017, 14:54  [ТС]
разметка кнопки:
Java
1
2
3
4
5
6
7
8
9
10
11
 <?xml version="1.0" encoding="utf-8"?>
<info.upump.upupmapp.entity.MyButton 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
 
    android:background="@drawable/logo"
    android:textColor="@color/colorAccent">
    
</info.upump.upupmapp.entity.MyButton>
класс кнопки:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package info.upump.upupmapp.entity;
 
import android.content.Context;
 
public class MyButton extends android.support.v7.widget.AppCompatButton {
    public MyButton(Context context) {
        super(context);
 
    }
 
    private int myId;
 
    public int getMyId() {
        return myId;
    }
 
    public void setMyId(int myId) {
        this.myId = myId;
    }
}

кнопка добавляется в адаптере 34 строка:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import com.nex3z.flowlayout.FlowLayout;
 
import java.util.List;
 
import info.upump.upupmapp.R;
import info.upump.upupmapp.entity.Exercise;
import info.upump.upupmapp.entity.MyButton;
import info.upump.upupmapp.entity.Tries;
 
 
public class ExerciseAdapter extends RecyclerView.Adapter<ExerciseAdapter.Holder> {
    private List<Exercise> exerciseList;
 
 
    public ExerciseAdapter(List<Exercise> exerciseList) {
        this.exerciseList = exerciseList;
    }
 
    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_exercise_item, parent, false);
 
        return new Holder(view);
    }
 
    @Override
    public void onBindViewHolder(Holder holder, int position) {
// создаю надпись 
        holder.title.setText(exerciseList.get(position).getTitle().substring(0, 1).toUpperCase() + 
        exerciseList.get(position).getTitle().substring(1, exerciseList.get(position).getTitle().length()));
       
        List<Tries> triesList = exerciseList.get(position).getTriesList();
 
//создаю неоьходимое кол-во кнопок
 
 
        for (int i = 0; i < triesList.size(); i++) {
          
 
                // первым параметром в  View.inflate беру контекст view моего Holder :
            MyButton button = (MyButton) View.inflate(holder.itemView.getContext(), R.layout.my_button, null);
            button.setText(String.valueOf(i));
 
            holder.linearLayout.addView(button, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
                                                                                                            ViewGroup.LayoutParams.WRAP_CONTENT));
         
 
        }
    }
 
    @Override
    public int getItemCount() {
        return exerciseList.size();
    }
 
    public class Holder extends RecyclerView.ViewHolder {
        private TextView title;
        private View itemView;
        private FlowLayout linearLayout;
 
        public Holder(View itemView) {
            super(itemView);
            this.itemView = itemView;
            title = (TextView) itemView.findViewById(R.id.title_exercise);
            linearLayout = (FlowLayout) itemView.findViewById(R.id.containerBtn);
        }
    }
}

лог:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
06-21 07:53:22.510 1083-1083/info.upump.upupmapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: info.upump.upupmapp, PID: 1083
                                                                   android.view.InflateException: Binary XML file line #2: Error inflating class info.upump.upupmapp.entity.MyButton
                                                                       at android.view.LayoutInflater.createView(LayoutInflater.java:616)
                                                                       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
                                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:482)
                                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
                                                                       at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
                                                                       at android.view.View.inflate(View.java:18415)
                                                                       at info.upump.upupmapp.adapters.ExerciseAdapter.onBindViewHolder(ExerciseAdapter.java:42)
                                                                       at info.upump.upupmapp.adapters.ExerciseAdapter.onBindViewHolder(ExerciseAdapter.java:19)
                                                                       at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6356)
                                                                       at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6389)
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.06.2017, 14:58
Лучший ответ Сообщение было отмечено werrt как решение

Решение

должен быть второй конструктор с двумя параметрами, как в моем примере
его можно автоматом генерить - в классе кнопки нажать ALT+INS и там выбрать Constructor
и добавить недостающий
1
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
21.06.2017, 15:01  [ТС]
Pablito,
"It's Alive" ))
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.06.2017, 15:01
Помогаю со студенческими работами здесь

Анимированный дизайн смены Layout или просто выдвигаемый layout
Ну, думаю тут и так всё понятно. Я просто не знаю, какие ключевые слова вводить в гугл, всё что попадается это Drawer А мне нужнен просто...

At android.widget.LinearLayout.setChildFrame Layout в Layout-те
Нужен совет бывалых. У меня есть активити которое запускается с мейн активити, на нем лежит Layout (горизонтальный) в котором 2й...

Не хочет работать в layout, но включается в layout-land
доброе утро ! пишу первое приложение. обычный мейн.хмель выглядит вот так : &lt;?xml version=&quot;1.0&quot;...

Использование Layout в другом Layout
Нужно в одной форме использовать 2 вида Layout, причем один должен быть вложен в другой, это реально?

Абстрактный класс для layout
Уважаемые, форумчане, помогите решить проблему. В приложении большое количество layout с одинаковыми view-элементами, а именно TextView и ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru