Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Создание подкнопки динамически - Программирование Android

12.01.2015, 16:01. Просмотров 766. Ответов 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 с вертикальной ориентацией и в нее писать эту кнопку, но что то у меня не получается, может кто нибудь сможет помочь?)
0
Миниатюры
Создание подкнопки динамически  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2015, 16:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание подкнопки динамически (Программирование Android):

Создать базу данных с(Создание функции БД, Создание процедуры БД, Создание тригера БД) - Программирование Android
В задание для курсовой работы по БД входят вот такие пункты: 1.2 Создание функции БД. 1.3 Создание процедуры БД 1.4 Создание...

Динамически созданные компоненты - Программирование Android
Здравствуйте, возник вопрос. есть Fragment на него в run time добавляются компоненты, после смены fragment и последующем восстановлении,все...

Динамически созданные обьекты? - Программирование Android
Всем привет, кто знает подскажите!!! В коде динамически создаю кнопки на экране, как везде написано, доступ к таким элементам можно...

Создание таблиц динамически - Delphi
помогите пожалуйста! создал динамически таблицу tabl1:=TStringGrid.Create(form1); tabl1.Parent:=Form1; tabl1.Height:=120; ...

Создание таблицы динамически - Delphi БД
Здравствуйте всем. Возник вот такой вопрос: как создать новую таблицу имя таблицы чтобы взялось из edit.

Динамически создание переменных - C++ Builder
Всем день добрый. Вопрос такой Возможно ли создавать переменные динамически в цикле? Пример Имеется список с переменными ...

22
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 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);
    }
    
}
Можно добавить туда еще методов на все случаи жизни)
1
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
12.01.2015, 16:38  [ТС] #3
Не, тут немного не так, у меня в общем создаются кнопки по горизонтали, создаются, создаются, и тут я бац придумал создать под кнопку, жму кнопку для создания под кнопки, и на последнюю созданную вешается подкнопка) как то так.

И отдельный linear класс мне не катит, мне в нажатой динамически созданной кнопке нужно еще нажатия обрабатывать там разные действия..)
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 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);
    }
    
}
1
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
12.01.2015, 17:05  [ТС] #5
Ну, а само добавление кнопки под последнюю? у меня например оно создается отдельным слоем, а не под основной кнопкой. Я собственно это спрашивал)
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
12.01.2015, 17:08 #6
Цитата Сообщение от dajver Посмотреть сообщение
Ну, а само добавление кнопки под последнюю?
вот же
Цитата Сообщение от Spelcrawler Посмотреть сообщение
public void addSubButton(Button subButton){
* * * * addView(subButton);
* * }
Цитата Сообщение от dajver Посмотреть сообщение
у меня например оно создается отдельным слоем, а не под основной кнопкой
А зачем?
1
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
12.01.2015, 17:13  [ТС] #7
Не знаю, оно само так получается.

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

Как мне его дальше то юзать?) Я таким не промышлял никогда)
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 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);
1
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
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 минуты
просто в бошке не вяжется
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 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 раз, и пользуешься им в пару строк кода сколько угодно раз - не нужно каждый раз самому прописывать контейнер, класть в него две кнопки и т.д.
1
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
12.01.2015, 17:40  [ТС] #11
Вы наверное не правильно меня поняли) Мне создавать надо не сразу две кнопки, а создавать одну, а потом по клику создавать вторую. То есть я насоздавал например штук 5 кнопок, а под пятой хочу сделать еще одну, а потом опять шестую седьмую восьмую) и под восьмой еще создать, и так далее.
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 1
12.01.2015, 17:46 #12
Ну все верно, создаете мильон кнопок (AwesomeButton), потом когда решили добавить подкнопку берете кнопку к которой нужно ее добавить и кастуете на нее - button.addSubButton(subButton);, где subButton обычная кнопка (Button).
1
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
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 ?
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,663
Завершенные тесты: 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.
1
dajver
410 / 274 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
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 хоть убей, как пофиксить?) Сорри что спрашиваю такое, но впервые сталкиваюсь.
0
12.01.2015, 18:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2015, 18:13
Привет! Вот еще темы с ответами:

Создание списка динамически - JavaScript
люди помогите начинающему программисту разобраться с проблемой. Хочу при выборе из одно Select'a чтобы создавался Option'ы второго...

Создание строки динамически - C++
Есть задание: Дана строка символов, состоящаяиз произвольного текста, слова разделены пробелами. Вывести на экран порядковый номер слова...

Создание компонента динамически - Delphi
Создал динамически edit, ограничил его по размерам, но что то видимо упустил. Просьба написать что пропустил Скрин: ...

Создание Label динамически - C#
Нужно создать n-ое количесво Label'ов, вот код: for (int i = 0; i &lt; n; i++) { Label lab = new Label(); ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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