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

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

Войти
Регистрация
Восстановить пароль
 
ILNAR_93
Android
234 / 234 / 25
Регистрация: 19.01.2013
Сообщений: 1,784
Записей в блоге: 3
#1

Создать свой "контрол" наследник Button - Программирование Android

23.10.2016, 21:40. Просмотров 319. Ответов 10
Метки нет (Все метки)

Необходимо создать control.



У этого control задний фон должен быть таким

XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="30dp"/>
    <stroke android:width="4dp"  android:color="@color/design_text_bg_color"/>
<solid android:color="@color/design_button_bg_color"/>
</shape>

И при добавлении контрола в лаяут
как передать параметры color для solid и stroke, а так-же width для stroke

XML
1
2
3
4
5
6
7
8
  <....control
                android:text="текст"
                android:layout_width="match_parent"
                android:id="@+id/Button"
                android:background="@drawable/design_button_bg"
                android:layout_marginBottom="5dp"
                android:layout_height="40dp"
                android:textColor="@color/white" />

Помогите пжлста кодом или ссылкой на разжёванный материал.
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2016, 21:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создать свой "контрол" наследник Button (Программирование Android):

Создать свой "контрол" - Программирование Android
Как сделать что то типа своего контрола? Получается что то типа Custom Adapter`а для ListView Но не адаптер а View элемент ...

Создать свой "реактор" - Программирование Android
Как вставить СВОЙ обработчик СВОЕГО события? Пробую написать свой класс обработки мультитатча (MyMulti). За основу взял обработку...

Как прикрутить "свой браузер" к странице - "фрагмент" - Программирование Android
здравствуйте. все, уже голову сломал. не соображаю совсем. не получается прикрутить код браузера к странице fragments.выводиться должно на-...

В объявлении new Button красным подчёркивает "this" - Программирование Android
Здравствуйте, уважаемы программисты! Не могли бы вы мне помочь? ЧТО НЕ ТАК С ЭТИМ ОТРЫВКОМ КОДА????????? public void onClick(View...

Свой Launcher. Срабатывает кнопка "назад" - Программирование Android
Здравствуйте! -Пишу свой простенький Laucher(во многом опирался на этот пример). -Тестирую на телефоне(texet). -При загрузке...

Работа с БД, связывание таблиц "фильмы", "жанры", "режиссеры" - Программирование Android
Ребят, всем привет! накидайте какие-нить идеи по реализации ситуация такая есть таблицы - &quot;списки_жанров&quot;, &quot;фильмы&quot;, &quot;режиссеры&quot; мне...

10
Pablito
2572 / 2054 / 639
Регистрация: 12.05.2014
Сообщений: 7,215
Завершенные тесты: 1
24.10.2016, 10:40 #2
по-простому - никак

по-сложному
1. написать свою вьюшку, педварительно создать для нее Styleable атрибуты, потом в конструкторе вьюшки разбирать прилетающий массив атрибутов и создавать шейп программно

2. просто создать шейп программно с нужными параметрами и назначить его на фон контрола

в чем прикол задавать отдельно размеры?
размер контрола известен судя по коду, значит и толщину линии можно подобрать заранее

ну и вынести все числа в dimens.xml
0
ILNAR_93
Android
234 / 234 / 25
Регистрация: 19.01.2013
Сообщений: 1,784
Записей в блоге: 3
24.10.2016, 10:42  [ТС] #3
Цитата Сообщение от Паблито Посмотреть сообщение
в чем прикол задавать отдельно размеры?
а так-же width для stroke - В некоторых местах толщина 0dpт.е. его не должно быть видно
0
Pablito
2572 / 2054 / 639
Регистрация: 12.05.2014
Сообщений: 7,215
Завершенные тесты: 1
24.10.2016, 10:44 #4
разные контролы - разные xml файлы с разными параметрами
0
ILNAR_93
Android
234 / 234 / 25
Регистрация: 19.01.2013
Сообщений: 1,784
Записей в блоге: 3
24.10.2016, 10:46  [ТС] #5
Паблито, не хотелось только из-за этого несколько контролов писать тем более не зная как пишется контрол )
0
Pablito
2572 / 2054 / 639
Регистрация: 12.05.2014
Сообщений: 7,215
Завершенные тесты: 1
24.10.2016, 10:48 #6
я до сих пор не понимаю в чем суть задачи
0
ILNAR_93
Android
234 / 234 / 25
Регистрация: 19.01.2013
Сообщений: 1,784
Записей в блоге: 3
24.10.2016, 10:53  [ТС] #7
Паблито,

Должна быть кнопка с фоном

Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="30dp"/>
    <stroke android:width="4dp"  android:color="@color/design_text_bg_color"/>
<solid android:color="@color/design_button_bg_color"/>
</shape>



И возможность смены цвета фона (solid ) и размера бордера(stroke - например в окошке авторизации кнопка с бордером, а в окошке профиля без).
0
Pablito
2572 / 2054 / 639
Регистрация: 12.05.2014
Сообщений: 7,215
Завершенные тесты: 1
24.10.2016, 11:02 #8
а почему просто не применять фон там где надо? и не применять там, где он не нужен?
хотя я об этом и говорил выше - разные контролы - разные файлы с фоном, мне кажется проще некуда
0
ILNAR_93
Android
234 / 234 / 25
Регистрация: 19.01.2013
Сообщений: 1,784
Записей в блоге: 3
24.10.2016, 13:09  [ТС] #9
Цитата Сообщение от Паблито Посмотреть сообщение
разные контролы - разные файлы с фоном, мне кажется проще некуда
Можно и так.

Если есть возможность сделать как я думаю, будет как то все в одном. Из-за этого хотелось так

Добавлено через 2 часа 1 минуту
Я сделал следующее:

1) Файл layout design_button.xml
XML
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/design_button"
        android:background="@drawable/design_button_bg"/>
 
</merge>
2) drawable design_button_bg.xml
XML
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="30dp"/>
<solid android:color="@color/design_button_bg_color"/>
</shape>
3) Контроллер
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class designButton extends LinearLayout {
    private View mView;
    private int backgroundColor;
 
    public designButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.designButton);
        try {
            backgroundColor = a.getColor(R.styleable.designButton_backgroundColor, MyApplication.getInstance().getColorCompat(R.color.design_button_bg_color));
        } finally {
            a.recycle();
        }
 
        LayoutInflater inflater;
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mView = inflater.inflate(R.layout.design_button, this);
 
        mView.findViewById(R.id.design_button).setBackgroundColor(backgroundColor);
 
    }
}
attrs.xml
XML
1
2
3
4
   <declare-styleable name="designButton">
        <attr name="backgroundColor" format="color" value="#00aff0"/>
 
    </declare-styleable>



Вот так я вставляю кнопку

XML
1
2
3
4
5
<....designButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="sdsds"
            app:backgroundColor="@color/white"/>
Я правильно вообще делаю?

Как мне применить app:backgroundColor="@color/white" для пункт 2 элемент solid
0
Pablito
2572 / 2054 / 639
Регистрация: 12.05.2014
Сообщений: 7,215
Завершенные тесты: 1
24.10.2016, 15:21 #10
все приходится делать самому
XML
1
2
3
4
5
6
7
8
9
10
    <company.testproject.AwesomeButton
        style="@style/Base.Widget.AppCompat.Button.Borderless"
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="OLOLO"
        app:cornerRadius="8dp"
        app:strokeColor="#77FF77"
        app:strokeWidth="2dp" />
XML
1
2
3
4
5
    <declare-styleable name="designButton">
        <attr name="strokeColor" format="color" />
        <attr name="strokeWidth" format="dimension" />
        <attr name="cornerRadius" format="dimension" />
    </declare-styleable>
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.util.AttributeSet;
import android.widget.Button;
 
public class AwesomeButton extends Button {
 
    public AwesomeButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.designButton);
        final int strokeColor = a.getColor(R.styleable.designButton_strokeColor, Color.BLACK); // по дефолту типа черный
        final int strokeWidth = a.getDimensionPixelSize(R.styleable.designButton_strokeWidth, 4); // по дефолту, от балды 4 пикселя
        final int cornerRadius = a.getDimensionPixelSize(R.styleable.designButton_cornerRadius, 16);
        a.recycle();
        final GradientDrawable gd = new GradientDrawable();
        gd.setCornerRadius(cornerRadius);
        gd.setStroke(strokeWidth, strokeColor);
        setBackground(gd);
    }
}
1
ILNAR_93
Android
234 / 234 / 25
Регистрация: 19.01.2013
Сообщений: 1,784
Записей в блоге: 3
24.10.2016, 15:44  [ТС] #11
Цитата Сообщение от Паблито Посмотреть сообщение
все приходится делать самому
спасибо
А вот так получилось у меня
Кликните здесь для просмотра всего текста
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
public class designButton extends Button {
    private View mView;
    private int backgroundColor;
    private HelperClass helperClass;
 
    public designButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        helperClass = new HelperClass(context);
        // TODO Auto-generated constructor stub
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.designButton);
        if (a!=null) {
            try {
                backgroundColor = a.getColor(R.styleable.designButton_backgroundColor, MyApplication.getInstance().getColorCompat(R.color.design_button_bg_color));
            } finally {
                a.recycle();
            }
        }
 
 
        GradientDrawable gdDefault = new GradientDrawable();
        gdDefault.setColor(backgroundColor);
        gdDefault.setCornerRadius(helperClass.intToDp(60));
        gdDefault.setStroke(helperClass.intToDp(0), getResources().getColor(R.color.colorAccent));
 
        if (Build.VERSION.SDK_INT >= 16) {
            designButton.this.setBackground(gdDefault);
        } else {
            designButton.this.setBackgroundDrawable(gdDefault);
        }
 
    }
}


Добавлено через 1 минуту
Java
1
2
3
4
5
6
7
8
public int intToDp(int inttodipvar)
        {
            float fontScale = ctx.getApplicationContext().getResources().getConfiguration().fontScale;
            float SCALE = ctx.getApplicationContext().getResources().getDisplayMetrics().density * fontScale;
 
            float temp = inttodipvar * SCALE;
            return Math.round(temp);
        }
Добавлено через 2 минуты
Сейчас посмотрю твой вариант и буду использовать его . Спасибо.

Добавлено через 1 минуту
getDimensionPixelSize получается родной метод android`а который выполняет те же функции как и intToDp?
0
24.10.2016, 15:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2016, 15:44
Привет! Вот еще темы с ответами:

Ошибка "Unknown method "e" of "org.apache.commons.logging.Log" - Программирование Android
Unknown method 'e' of 'org.apache.commons.logging.Log' package com.mycompany.myapp; import android.widget.*; import...

Постепенно вывести на экран слово "Java", в котором буквы состоят из "интересных" элементов - Программирование Android
Я учусь в универе и вот пытаюсь делать лабораторные по языку java, только на свой телефон с помощью android studio )) До этого все...

Как создать "невидимое" приложение - Программирование Android
Здравствуйте. Недавно увидел в Play Market приложение, которое было невозможно открыть. Т.е. в диспечере приложений оно отображалось, а в...

Выбор платформы разработки "1С Мобильная платформа" или "Android Studio" - Программирование Android
Всем, здравствуйте! Есть задача по разработке клиента для терминала сбора данных. Для использования его c WMS. После долгих раздумий было...


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

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

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