Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
ILNAR_93
Android
236 / 236 / 49
Регистрация: 19.01.2013
Сообщений: 1,856
Записей в блоге: 3
#1

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

23.10.2016, 21:40. Просмотров 347. Ответов 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):

Создать свой "контрол"
Как сделать что то типа своего контрола? Получается что то типа Custom...

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

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

В объявлении new Button красным подчёркивает "this"
Здравствуйте, уважаемы программисты! Не могли бы вы мне помочь? ЧТО НЕ ТАК С...

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

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

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

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

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

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

ну и вынести все числа в dimens.xml
0
ILNAR_93
Android
236 / 236 / 49
Регистрация: 19.01.2013
Сообщений: 1,856
Записей в блоге: 3
24.10.2016, 10:42  [ТС] #3
Цитата Сообщение от Паблито Посмотреть сообщение
в чем прикол задавать отдельно размеры?
а так-же width для stroke - В некоторых местах толщина 0dpт.е. его не должно быть видно
0
Pablito
2655 / 2137 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
24.10.2016, 10:44 #4
разные контролы - разные xml файлы с разными параметрами
0
ILNAR_93
Android
236 / 236 / 49
Регистрация: 19.01.2013
Сообщений: 1,856
Записей в блоге: 3
24.10.2016, 10:46  [ТС] #5
Паблито, не хотелось только из-за этого несколько контролов писать тем более не зная как пишется контрол )
0
Pablito
2655 / 2137 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
24.10.2016, 10:48 #6
я до сих пор не понимаю в чем суть задачи
0
ILNAR_93
Android
236 / 236 / 49
Регистрация: 19.01.2013
Сообщений: 1,856
Записей в блоге: 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
2655 / 2137 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
24.10.2016, 11:02 #8
а почему просто не применять фон там где надо? и не применять там, где он не нужен?
хотя я об этом и говорил выше - разные контролы - разные файлы с фоном, мне кажется проще некуда
0
ILNAR_93
Android
236 / 236 / 49
Регистрация: 19.01.2013
Сообщений: 1,856
Записей в блоге: 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
2655 / 2137 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 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
236 / 236 / 49
Регистрация: 19.01.2013
Сообщений: 1,856
Записей в блоге: 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"
Unknown method 'e' of 'org.apache.commons.logging.Log' package...

Разработка мобильного приложения "Музыкальный плеер" на Android. Кто готов создать - пишите
Разработка мобильного приложения &quot;Музыкальный плеер&quot; на Android. Кто готов...

Постепенно вывести на экран слово "Java", в котором буквы состоят из "интересных" элементов
Я учусь в универе и вот пытаюсь делать лабораторные по языку java, только на...

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


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

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

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