Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
sanek819
2 / 2 / 0
Регистрация: 15.06.2010
Сообщений: 13
1

Создание кастомного View "Матрица"

23.11.2013, 18:16. Просмотров 876. Ответов 2
Метки нет (Все метки)

Здравствуйте! Взялся за написание компонента, который отображает матрицу произвольного размера.

Java
1
2
3
4
public class MatrixView extends View
{
    private int rows, columns; //Число строк, столбцов матрицы
    private EditText[][] matrix; //Двумерный массив, содержащий поля ввода
Идея была такая: пользователь вводит размерность матрицы, жмет "Ввести матрицу", после чего отображается компонент MatrixView с таким размером, который ввел пользователь. Затем пользователь заполняет матрицу(вводит значения в EditText-ы) и жмет "Сохранить матрицу", после чего сохраняется двумерный массив double-ов с введенной матрицей.
Конструктор класса:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public MatrixView(Context context)
    {
        super(context);
        matrix = new EditText[rows][columns];
 
        for(int i = 0;i < rows;i++)
        {
            for(int j = 0;j < columns;j++)
            {
                matrix[i][j] = new EditText(context);
                matrix[i][j].setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL); //Поля для ввода десятичных чисел
            }
        }
    }
Тут сразу возник вопрос: Как передать компоненту размеры, которые ввел пользователь, чтобы записать их в rows и columns?
Еще возник другой вопрос, а как это рисовать?
Единственное, что пришло в голову
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
        @Override
    protected void onDraw(Canvas canvas) //Метод отрисовки
    {
        super.onDraw(canvas);
        
        int widthTail = getWidth()/(columns + 1); //Ширина одного EditText-а
        int heightTail = widthTail*3/4; //Высота одного EditText-а
 
                RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        
        int leftMargin = (getWidth() - rows*widthTail)/(rows + 1); //Отступ слева каждого EditText-a
        int rightMargin = leftMargin; //Отступ справа каждого EditText-a
        int topMargin = (getHeight() - columns*heightTail)/(columns + 1); //Отступ сверху каждого EditText-a
        int bottomMargin = topMargin; //Отступ снизу каждого EditText-a
        
        for(int i = 0;i < rows;i++)
        {
            int topM = (i + 1)*topMargin + i*heightTail; //Отступ рисуемого EditText-a от верхнего края
            int bottomM = (rows - i)*bottomMargin + (rows - i - 1)*heightTail; //Отступ рисуемого EditText-a от нижнего края
            for(int j = 0;j < columns;j++)
            {
                int leftM = (j + 1)*leftMargin + j*widthTail; //Отступ рисуемого EditText-a от левого края
                int rightM = (columns - j)*rightMargin + (columns - j - 1)*widthTail; //Отступ рисуемого EditText-a от правого края
                lp.setMargins(leftM, topM, rightM, bottomM);
                matrix[i][j].setLayoutParams(lp);
                matrix[i][j].draw(canvas);
            }
        }
    }
Не могу понять, как сделать так, чтобы пользователь ввел размерность матрицы, после этого создался компонент с заданной пользователем размерностью, создался массив EditText[rows][columns] и все это отобразилось с заданными отступами. Помогите, пожалуйста, разобраться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2013, 18:16
Ответы с готовыми решениями:

Как сделать View "не прозрачным" для кликов
В общем имею много слойный экран, на нижнем - карта, выше - элементы управления...

Как называется View, который представляет из себя "площадку" для размещения контента (на скриншоте)
Здравствуйте! Пожалуйста, скажите, как называется View на скриншоте. То есть,...

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

Ошибка "Unknown method "e" of "org.apache.commons.logging.Log"
Unknown method 'e' of 'org.apache.commons.logging.Log' package...

Создание приложения "Расписание по группам вуза"
Доброго времени суток, пришло время работы над дипломом. Хочу создать...

2
NiRamz
211 / 211 / 33
Регистрация: 26.12.2010
Сообщений: 691
23.11.2013, 20:51 2
как вариант
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
LinearLayout parent = (LinearLayout) getView().findViewById(R.id.ll);
        for(int i=0; i < rows; i++) {
            
            LinearLayout ll = new LinearLayout(getActivity());
            ll.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            
            for(int j=0; j<colums; j++) {
                EditText et = new EditText(getActivity());
                et.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1));
                ll.addView(et);
            }
            parent.addView(ll);
        }
0
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
24.11.2013, 13:24 3
По поводу, как передать данные, то это еще легче, просто в конструктор)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public MatrixView(Context context, int rows, int columns)
    {
        super(context);
        this.rows = rows;
        this.columns = columns;
        matrix = new EditText[rows][columns];
 
        for(int i = 0;i < rows;i++)
        {
            for(int j = 0;j < columns;j++)
            {
                matrix[i][j] = new EditText(context);
                matrix[i][j].setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL); //Поля для ввода десятичных чисел
            }
        }
    }
Добавлено через 2 минуты
И еще совет не большой, не лепите все построение в конструктор, создайте private функцию, назовите ее, например, builder и вынесите как можно больше кода в неё, а ее уже вызывайте в конструкторе, это нужно для того, чтобы в будущем было проще добавить новый конструктор, если таковой понадобится...сам просто сталкивался с этим)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2013, 13:24

Создание приложения в android "Транспортная карта"
Доброго времени суток уважаемые гуру программирования на android! Появилась...

Создание Android-приложения связанного с "Вконтакте"
Всем привет! Появилась такая идея создать приложения для своей группы...

Пошаговое создание кнопки "back"
ДОбрый день, подскажите пожалуйста пошагово, как создать в приложении кнопку...


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

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

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