Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
#1

Создание подкнопки динамически - Android

12.01.2015, 16:01. Просмотров 700. Ответов 22
Метки нет (Все метки)

В общем какое дело я создаю кнопки динамически в LinearLayout который их распологает горизонтально.

Java
1
2
3
4
5
6
LinearLayout layout = (LinearLayout) rootView.findViewById(R.id.buttonsView);
        layout.setOrientation(LinearLayout.HORIZONTAL);
        layout.setGravity(Gravity.CENTER);
        final Button btn = new Button(getActivity());
        btn.setText("" + counter);
        layout.addView(btn);
Вот так они создаются одна за другой в горизонтальном положении, а теперь в этом горизонтальном списке мне нужно под последней созданной кнопкой, создать еще одну кнопку. Как на картинке.

Я как бы понимаю что мне надо динамически создавать доп LinearLayout с вертикальной ориентацией и в нее писать эту кнопку, но что то у меня не получается, может кто нибудь сможет помочь?)
Миниатюры
Создание подкнопки динамически  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2015, 16:01     Создание подкнопки динамически
Посмотрите здесь:

Android Динамически создать layout для адаптера
TextView динамически растянуть на всю область Android
Android Динамически созданные компоненты
Android Как динамически заполнять ListView из другой activity?
Android Высота/ширина динамически создаваемого элемента
Назначение id динамически созданным view Android
Android Динамически созданный элемент по центру
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
12.01.2015, 16:26     Создание подкнопки динамически #2
dajver, я бы сделал кастомный лейаут, что-то наподобии этого.
Java
1
2
3
4
5
6
7
8
9
10
public class TwoButtons extends LinearLayout {    
    
    public TwoButtons(Context context, Button mainButton, Button secondButton) {
        super(context);
        setOrientation(VERTICAL);
        addView(mainButton);
        addView(secondButton);
    }
    
}
Можно добавить туда еще методов на все случаи жизни)
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
12.01.2015, 16:38  [ТС]     Создание подкнопки динамически #3
Не, тут немного не так, у меня в общем создаются кнопки по горизонтали, создаются, создаются, и тут я бац придумал создать под кнопку, жму кнопку для создания под кнопки, и на последнюю созданную вешается подкнопка) как то так.

И отдельный linear класс мне не катит, мне в нажатой динамически созданной кнопке нужно еще нажатия обрабатывать там разные действия..)
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
12.01.2015, 16:45     Создание подкнопки динамически #4
Тогда можно как-то так:
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
public class AwesomeButton extends LinearLayout {
 
    Button mainButton;
    
    public AwesomeButton(Context context) {
        super(context);
        setOrientation(VERTICAL);
        
        mainButton = new Button(context);
        addView(mainButton);
        
    }
    
    public void setText(CharSequence text){
        mainButton.setText(text);
    }
 
    @Override
    public void setOnClickListener(OnClickListener l) {
        mainButton.setOnClickListener(l);
    }
    
    //Еще какие то методы из Button к которым нужен доступ.
    
    public void addSubButton(Button subButton){
        addView(subButton);
    }
    
}
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
12.01.2015, 17:05  [ТС]     Создание подкнопки динамически #5
Ну, а само добавление кнопки под последнюю? у меня например оно создается отдельным слоем, а не под основной кнопкой. Я собственно это спрашивал)
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
12.01.2015, 17:08     Создание подкнопки динамически #6
Цитата Сообщение от dajver Посмотреть сообщение
Ну, а само добавление кнопки под последнюю?
вот же
Цитата Сообщение от Spelcrawler Посмотреть сообщение
public void addSubButton(Button subButton){
* * * * addView(subButton);
* * }
Цитата Сообщение от dajver Посмотреть сообщение
у меня например оно создается отдельным слоем, а не под основной кнопкой
А зачем?
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
12.01.2015, 17:13  [ТС]     Создание подкнопки динамически #7
Не знаю, оно само так получается.

У меня еще и куча настроек по конкретной кнопке... Мне их создавать в классе который я юзаю для ициализации кнопок или внутри класса лейаута?

Как мне его дальше то юзать?) Я таким не промышлял никогда)
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
12.01.2015, 17:16     Создание подкнопки динамически #8
Цитата Сообщение от dajver Посмотреть сообщение
Как это зачем?) Стоит такая задача, вот собственно и требуется сделать так)
Именно задаче сделать эту кнопку отдельным слоем? Если нет - мой вариант подходит. Юзать просто:
Java
1
2
3
4
5
6
AwesomeButton button = new  AwesomeButton(context);
button.setText("text");
button.setOnClickListener(listener);
Button subButton = new Button(context);
//все что нужно сделать с подкнопкой.
button.addSubButton(subButton);
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
12.01.2015, 17:25  [ТС]     Создание подкнопки динамически #9
Я не понимаю, не понимаю как мне это в мой код вставить)

У меня во первых оно все создается в уже подготовленый для этого Linear на леяуте
Java
1
LinearLayout layout = (LinearLayout) rootView.findViewById(R.id.buttonsView);
Во вторых у меня обрабатывается клик на каждую кликнутую кнопку, и в зависимости от кликнутой у меня отображаются нужные данные в списке)

И в третих у меня кнопки видоизменяются во время клика (меняется цвет, размер, размер текста на ней) и кое какие действия еще происходят) Мне надо клик перенести на фрагмент где все это происходит, иначе капец)

И наконец, как мне создавать главные кнопки которые я уже создаю, вот этим способом через этот класс? или это не обязательно?
Java
1
2
3
4
5
6
LinearLayout layout = (LinearLayout) rootView.findViewById(R.id.buttonsView);
        layout.setOrientation(LinearLayout.HORIZONTAL);
        layout.setGravity(Gravity.CENTER);
        final Button btn = new Button(getActivity());
        btn.setText("" + counter);
        layout.addView(btn);
Я не понимаю этой логики, по идее оно ж должно создаваться внутри этого леяута который уже создан для кнопок которые есть?

Добавлено через 3 минуты
просто в бошке не вяжется
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
12.01.2015, 17:32     Создание подкнопки динамически #10
Цитата Сообщение от dajver Посмотреть сообщение
У меня во первых оно все создается в уже подготовленый для этого Linear на леяуте
Без проблем - код что выше для создания кнопки, там есть и листенер на нажатие, если нужны еще какие то действия с кнопкой перенаправляйте методы из AwesomeButton в mainButton (как я делал с setText и setOnClickListener). Т.е. все что вам нужно от кнопки переносите в свой класс. Дак вот создаете кнопку как я в предыдущем сообщении написал, а потом просто кладете ее на ваш rootView:
Java
1
rootView.addView(button);
Далее когда возникает необходимость добавить подкнопку сначала создаете ее (просто обычную кнопку) и вешаете ее под главной кнопкой:
Java
1
button.addSubButton(subButton);
И все. Или нужно еще что-то делать с кнопками?

Добавлено через 4 минуты
Цитата Сообщение от dajver Посмотреть сообщение
Я не понимаю этой логики, по идее оно ж должно создаваться внутри этого леяута который уже создан для кнопок которые есть?
В коде (когда уже юзаете эту кнопку) все будет выглядеть так, как будто это обычная кнопка. Но на самом деле это не кнопка, а LinearLayout с кнопкой, и все действия, которые вы кастуете на этот layout должны перенаправляться на кнопку, которая в этом layoute лежит. Немного запутанно и через чур сложно (всмысле кода много) кажется, но на деле это очень удобно - написал кастомный элемент 1 раз, и пользуешься им в пару строк кода сколько угодно раз - не нужно каждый раз самому прописывать контейнер, класть в него две кнопки и т.д.
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
12.01.2015, 17:40  [ТС]     Создание подкнопки динамически #11
Вы наверное не правильно меня поняли) Мне создавать надо не сразу две кнопки, а создавать одну, а потом по клику создавать вторую. То есть я насоздавал например штук 5 кнопок, а под пятой хочу сделать еще одну, а потом опять шестую седьмую восьмую) и под восьмой еще создать, и так далее.
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
12.01.2015, 17:46     Создание подкнопки динамически #12
Ну все верно, создаете мильон кнопок (AwesomeButton), потом когда решили добавить подкнопку берете кнопку к которой нужно ее добавить и кастуете на нее - button.addSubButton(subButton);, где subButton обычная кнопка (Button).
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
12.01.2015, 18:00  [ТС]     Создание подкнопки динамически #13
Так давайте еще раз. Я не понимаю пока как с этим работать. Посмотрите мой код создания кнопок, сильно не пугайтесь.

Кликните здесь для просмотра всего текста
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
final int btnSize = 160;
        final int btnSmallSize = 80;
        final int textSize = 25;
        final int smallTextSize = 16;
        final int margin = 25;
 
        LinearLayout layout = (LinearLayout) rootView.findViewById(R.id.buttonsView);
        layout.setOrientation(LinearLayout.HORIZONTAL);
        layout.setGravity(Gravity.CENTER);
        final Button btn = new Button(getActivity());
        final LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams(btnSize, btnSize);
        final LinearLayout.LayoutParams sp = new LinearLayout.LayoutParams(btnSmallSize, btnSmallSize);
        btn.setLayoutParams(vp);
        sp.setMargins(0, 0, margin, 0);
        vp.setMargins(0, 0, margin, 0);
        btn.setTextColor(Color.WHITE);
        btn.setTextSize(textSize);
        btn.setId(counter);
        btn.setText("" + counter);
        btn.setBackgroundResource(R.drawable.round_button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//это я беру текст с кнопки, это номер ее
                stepNumber = ((TextView) v).getText().toString();
//а тут я уменьшаю все кнопки что есть, а кликнутую оставляю дефолтного размера
                for (int i = 0; i < allBtns.size(); i++) {
                    allBtns.get(i).setLayoutParams (sp);
                    allBtns.get(i).setTextSize(smallTextSize);
                }
                allBtns.get(v.getId() - 1).setLayoutParams (vp);
                allBtns.get(v.getId() - 1).setTextSize(textSize);
 
//метод который выводит данные
                selectData();
            }
        });
//добавляю в массив все кнопки которые создаются
        allBtns.add(btn);
// делаю тоже самое что в клике только с последней кнопокй
        for (int i = 0; i < allBtns.size(); i++) {
            allBtns.get(i).setLayoutParams (sp);
            allBtns.get(i).setTextSize(smallTextSize);
        }
        allBtns.get(allBtns.size() - 1).setLayoutParams(vp);
        allBtns.get(allBtns.size() - 1).setTextSize(textSize);
//добавляю в вью ее
        layout.addView(btn);
        }


Как к этому всему присобачить код который вы дали?

Добавлено через 1 минуту
И где мне клик обрабатывать? В фрагменте или в кастомном linear layout'e ?
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
12.01.2015, 18:08     Создание подкнопки динамически #14
Вместо
final Button btn = new Button(getActivity());
Пишите
final AwesomeButton btn = new AwesomeButton (getActivity());

Далее ВСЕ методы которые вам нужны от кнопки нужно добавить в класс AwesomeButton например setBackgroundResource:
Java
1
2
3
4
5
6
    //Это все в классе AwesomeButton
    @Override
    public void setBackgroundResource(int resid) {
        mainButton.setBackgroundResource(resid);
    }
    //И таким образом все методы которые должны быть доступны при создании кнопки переводите на mainButton.
Когда и собственно делаете потом с этой "кнопкой" то же что сейчас делаете с обычным Button'ом (задаете размеры, бг, листенеры и т.д.). И вообще полностью общаетесь с ней как с обычной конпкой (если не хватает какого то метода, который есть в Button "переводите" его как в примере с setBackgroundResource). Ну и добавляете себе в List. При необходимости добавить подкнопку добавляете ее методом addSubButton.
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
12.01.2015, 18:13  [ТС]     Создание подкнопки динамически #15
Методы

Java
1
2
3
4
5
6
7
8
9
@Override
    public void setTextColor(int color) {
        mainButton.setTextColor(color);
    }
 
    @Override
    public void setTextSize(float size) {
        mainButton.setTextSize(size);
    }
подчеркиваются красным @Override хоть убей, как пофиксить?) Сорри что спрашиваю такое, но впервые сталкиваюсь.
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
12.01.2015, 18:21     Создание подкнопки динамически #16
Убрать @Override)
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
12.01.2015, 18:37  [ТС]     Создание подкнопки динамически #17
Какая то фигня получается) оно создает постоянно две кнопки, или я рукожоп или снежки не лепятся.

Метод создания кнопки
Кликните здесь для просмотра всего текста
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
final int btnSize = 160;
        final int btnSmallSize = 80;
        final int textSize = 25;
        final int smallTextSize = 16;
        final int margin = 25;
 
        LinearLayout layout = (LinearLayout) rootView.findViewById(R.id.buttonsView);
        layout.setOrientation(LinearLayout.HORIZONTAL);
        layout.setGravity(Gravity.CENTER);
        final CreateButton btn = new CreateButton (getActivity());
        final LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams(btnSize, btnSize);
        final LinearLayout.LayoutParams sp = new LinearLayout.LayoutParams(btnSmallSize, btnSmallSize);
        btn.setLayoutParams(vp);
        sp.setMargins(0, 0, margin, 0);
        vp.setMargins(0, 0, margin, 0);
        btn.setTextColor(Color.WHITE);
        btn.setTextSize(textSize);
        btn.setId(counter);
        btn.setText("" + counter);
        btn.setBackgroundResource(R.drawable.round_button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stepNumber = ((TextView) v).getText().toString();
                for (int i = 0; i < allBtns.size(); i++) {
                    allBtns.get(i).setLayoutParams (sp);
                    allBtns.get(i).setTextSize(smallTextSize);
                }
                allBtns.get(v.getId() - 1).setLayoutParams (vp);
                allBtns.get(v.getId() - 1).setTextSize(textSize);
 
                //selectData();
            }
        });
        allBtns.add(btn);
        for (int i = 0; i < allBtns.size(); i++) {
            allBtns.get(i).setLayoutParams (sp);
            allBtns.get(i).setTextSize(smallTextSize);
        }
        allBtns.get(allBtns.size() - 1).setLayoutParams(vp);
        allBtns.get(allBtns.size() - 1).setTextSize(textSize);
        Button b = new Button(getActivity());
        if(type.equals("sub")) {
            btn.addSubButton(b);
            layout.addView(btn);
        } else {
            layout.addView(btn);
        }


ваше класс
Кликните здесь для просмотра всего текста
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
public class CreateButton extends LinearLayout {
 
    private Button mainButton;
 
    public CreateButton(Context context) {
        super(context);
        setOrientation(VERTICAL);
 
        mainButton = new Button(context);
        addView(mainButton);
 
    }
 
    public void setText(CharSequence text){
        mainButton.setText(text);
    }
 
    @Override
    public void setBackgroundResource(int resid) {
        mainButton.setBackgroundResource(resid);
    }
 
    public void setTextColor(int color) {
        mainButton.setTextColor(color);
    }
 
    public void setTextSize(float size) {
        mainButton.setTextSize(size);
    }
 
    @Override
    public void setOnClickListener(OnClickListener l) {
        mainButton.setOnClickListener(l);
    }
 
    public void addSubButton(Button subButton){
        addView(subButton);
    }
 
}


поясните плиз что не так

Добавлено через 2 минуты
Но вообще мне надо создавать эту же кнопку что я создаю раньше, только как саб кнопку) ТО есть в addSubView мне надо указывать этот же класс как кнопку?

Java
1
2
3
public void addSubButton(CreateButton subButton){
        addView(subButton);
    }
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
12.01.2015, 18:40     Создание подкнопки динамически #18
Видимо type всегда равен sub. Всегда нужно добавлять в подкнопку точную копию основной?
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
12.01.2015, 18:42  [ТС]     Создание подкнопки динамически #19
Видимо type всегда равен sub.
Не, не всегда, у меня обычно оно равно main, sub только когда вовзращено что саб кнопку создавать надо. Но всегда создается и главная и под.

Всегда нужно добавлять в подкнопку точную копию основной?
Ну по сути они все одинаковые, так что да
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2015, 20:26     Создание подкнопки динамически
Еще ссылки по теме:

Android Изменение позиции динамически созданного элемента
Android Фильтрация ввода у динамически созданных edittext
Android Обработчик динамически созданных кнопок
Android Динамически созданные обьекты?
Android Достать массив из динамически созданного адаптера)

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

Или воспользуйтесь поиском по форуму:
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
12.01.2015, 20:26     Создание подкнопки динамически #20
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот набросал кривоватое приложение)
Yandex
Объявления
12.01.2015, 20:26     Создание подкнопки динамически
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru