Страницы

Поиск по вопросам

Показаны сообщения с ярлыком ui. Показать все сообщения
Показаны сообщения с ярлыком ui. Показать все сообщения

понедельник, 30 марта 2020 г.

Изменение кастомного макета для Spinner'a после его создания

#android #ui #android_spinner


Можно ли как-нибудь изменить кастомный макет для Spinner'a после его создания?
Например, у меня есть Spinner, макет которого состоит из TextView и ImageView:











наполнение его выглядит так:

Spinner spinner = findViewById(R.id.spinner_sorting);
        ArrayAdapter spinnerAdapter = new ArrayAdapter(this,
                R.layout.spinner_row, R.id.tv_sorting, getResources().getStringArray(R.array.sorting_array));
        spinner.setAdapter(spinnerAdapter);


и в итоге Spinner выглядит следующим образом:



А мне хотелось бы изменить каждую вторую ImageView в этом Spinnere. Как это можно
сделать?
    


Ответы

Ответ 1



Создала кастомный адаптер для Spinner-a: public class SortingSpinnerAdapter extends ArrayAdapter { private LayoutInflater inflater; private Context context; private String[] data; public SortingSpinnerAdapter(@NonNull Context context, int resource, int textViewResourceId, String[] data) { super(context, resource, textViewResourceId, data); inflater = LayoutInflater.from(context); this.context = context; this.data = data; } @Override public View getView(int position, View convertView, ViewGroup parent) { return createView(position, convertView, parent); } @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { return createView(position, convertView, parent); } private View createView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.spinner_row, parent, false); holder = new ViewHolder(); holder.textView = convertView.findViewById(R.id.tv_sorting); holder.imageView = convertView.findViewById(R.id.iv_arrow); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } onBindViewHolder(holder, position); return convertView; } private void onBindViewHolder(ViewHolder holder, int pos) { holder.textView.setText(data[pos]); if (pos % 2 == 0) { holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.arrow_downward)); } else { holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.arrow_upward)); } } static class ViewHolder { TextView textView; ImageView imageView; } } В итоге получила именно то, что хотела:

четверг, 13 февраля 2020 г.

Отмена действия

#c_sharp #aspnet_mvc #ui


Доброго времени суток.
Есть задача: возможность отмены собственных действий на сайте/форуме, например удалил
сообщение/коммент(не смотря на предварительно подтверждёный вопрос подтверждения) и
пожалел о содеяном, тогда подобная функция отмены будет очень кстати.
На данном ресурсе есть возможность отмены голоса ЗА и/или ПРОТИВ, которая достаточно
полезна.
Собственно вопрос: как реализовывать подобный функционал? Когда выполнять запрос
удаления записи(или любой другой операции) из базы? Или просто помечать запись определённым
флагом "deleted"? 
Какой метод решения является самым оптимальным? Просто придумать какой-нибудь велосипедо-костыль
не составит труда, хотелось бы всё сделать правильно.
Буду рад словесному описанию алгоритмов или ссылок на чтиво касающегося данной темы.
Зарание благодарю.
UPD: ответ тов. @wind хорош, но хотелось бы узнать по данной теме по-больше    


Ответы

Ответ 1



Для реализации отмены каких-либо действий однозначно нужно их где-то хранить, чтобы иметь возможность откатиться к прежней версии или восстановить удаленное. И так как мы говорим о веб-разработке, то у нас как обычно встает два варианта: клиент и сервер. Но выдумывать хранение данной информации на клиенте в куках или прям на странице или хз где еще, как по мне, как раз описанный вами "велик" (еще и не "секьюрно"). Следовательно нужно хранить на сервере, а раз мы выбираем сервер, то почему бы не юзать ту же БД, в которой итак все хранится. Поэтому я считаю, что оптимально использовать именно схему "с флагами в БД". Судя по вопросу вы вкурсе, как ее реализовать, да это и вовсе не сложно. Единственное, что хочу еще добавить, так это версионность, которая, как пример, реализована при редактировании вопросов на данном форуме. То есть можно в БД не только помечать запись какую-либо, как удаленную, а реализовать некую структуру для хранения версий постов, комментариев и тд. Имея данную структуру в БД, можно отменить не только одно действие, а вернуться к любому предыдущему, но это уже во многом зависит от задачи, нужно ли оно вообще вам или достаточно всего лишь отмены удаления. К тому же, если рассматривать какую-либо соц. сеть, то при удалении например профайла юзера, насколько я знаю, опять же используется данная схема, ну и было бы странно, если удалив юзера, со всего портала пропала оставленная им информация, хотя иногда это требуется по ТЗ и тогда "каскады" в БД или ОРМ сама подчистит все связанные с сущностью данные.

Ответ 2



Хранить в сессии историю команд. Интерфейс команды должен иметь методы Undo и Redo.

среда, 29 января 2020 г.

UI потоки в java

#java #многопоточность #ui #терминология


Что такое UI потоки в Java? В чем их отличие от обычных потоков Thread?
    


Ответы

Ответ 1



UI поток - обычный поток, но в нем и только в нем следует обновлять состояние вашего GUI или его элементов. Как правило представляет собой поток извлекающий из очереди задачи для обновления или перерисовки интерфейса. Если вам надо обновить ваш GUI не из UI потока, то как в Swing так и в JavaFX есть методы, которые добавляют задачи по добавлению GUI в эту очередь. Сделано так для того, что бы не занимать синхронизацией обращений к элементам интерфейса и не допустить параллельного выполнения операций над ним.

Ответ 2



Добавлю к ответу @АлександрМартынцев UI Thread это частный вид Event dispatching thread, который в свою очередь является частью концепции Event Driven Programming, разработанной, когда большинства юзеров SO еще не было даже в планах их родителей :) - это концепция была рождена в недрах компании IBM еще в 70-х годах и нашла свое отражение в первых оконных (или как сейчас модно говорить GUI) системах - типа Xerox Parc. Любая GUI система имеет такой тред, в .NET и Java/Android это называется UI Thread, в других системах по другому, но смысл один и тот же

вторник, 28 января 2020 г.

Научиться JavaScript [закрыт]

#jquery #видео_курс #javascript #ui #ux


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он соответствовал тематике «Stack Overflow на русском».
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Здравствуй, сообщество (: 
Хочу изучить JavaScript, знаю несколько языков, имею огромный опыт веб-разработки,
но до JS руки так и не дошли, постоянно брал откуда-то готовые примеры, никогда специфического
ничего не требовалось. Но сейчас я хочу закрыть эту большую дыру и творить! (:
Мне не нужны начальные теоретические знания: циклы, условия, ооп и тому подобные
конструкции - теорию я уже знаю. Я хочу боевых скринкастов / видеоуроков, мануалов,
уроков или чего нибудь такого, где сразу без занудства будут описывать анимации, события,
применение конкретных фреймворков - и их объектов и методов, или просто что нибудь
красивое (: 
В общем нужны пособия по UI / UX.
Английский язык не проблема - если есть что-нибудь стоящее - предлагайте! С удовольствием
посмотрю / почитаю.    

Заранее огромное спасибо!
UPD: Прошло чуть меньше года, с момента как я задал этот вопрос, и я до сих пор изучаю
все прелести JS. Тем, кто задаётся похожей целью, и тоже считает, что ему не нужны
теоретические знания о JS - Вы, как и я раньше, ошибаетесь. JavaScript - прекраснейший
язык, в нём много отличий от обычных ОО языков. Тут тебе и сплошь объекты, и прототипы,
и события... В общем - начинайте с низов, и будет Вам счастье.    


Ответы

Ответ 1



Мне не нужны начальные теоретические знания "JavaScript Шаблоны" уже рекомендовали так что: JavaScript Web Applications Learning JavaScript Design Patterns прочее: Что почитать, чтобы повысить свой уровень JavaScript ECMA-262-3 in detail wtfjs по UI / UX. Ководство Психбольница в руках пациентов

Ответ 2



Привет. Можете почитать следующие книги: Стоян Стефанов "JavaScript Шаблоны", шаблоны программирования и проектирования высококачественных приложений, а также книга Джона Рейсига "JavaScript Профессиональные приемы программирования". UPD Также книга Дэвида Флэнагана "JavaScript Подробное руководство", но Вам ее не всю можно читать, начало можете пропустить, т.к. там основы, однако в конце первой части книги и вся вторая часть книгипосвящена многим интересным вопросам программирования на JavaScript, например разработка сценариев для Java - приложений, JavaScript и XML, работа с графикой на стороне клиента.

Ответ 3



Предлагаю более забавный и интересный способ. codeacademy.com Заодно и английский язык потренируете. Это довольно интересный способ обучения. Но ни в коем случае не спорю, книги и практика это первейший источник обучения.

Ответ 4



Как я уже говорил здесь Для меня лучшая книга: Beginning JavaScript Paul Wilton Jeremy McPeak Third Edition От издательства Wrox , у меня перевод этой книги Пол Вилтон Джереми МакПик Java Script Руководство программиста от издательства Питер. У меня эта книга. Я вам её очень советую и (особенно для дизайна) это самый лучший учебник imho

суббота, 11 января 2020 г.

Что это за UI элемент?

#java #android #ui #bottom_sheet


Подскажите, что за UI элемент используется в WhatsApp (а именно, там где Documents,
Camera, ...), это BottomSheet, только его расположили вверху? Или это что-то другое?


    


Ответы

Ответ 1



DialogFragment + RevealEffect. Причем как был классический баг, так они его не исправили. При dispatch touch DialogFragment анимация может стартовать несколько раз, зависит от количества нажатий, пройдя свою duration, обрывается. Смотрится не ок.

вторник, 7 января 2020 г.

Как пишут фронтенд для Django

#django #ui #frontend


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

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

Пробовал писать на ReactJS, код получается структурированным, понятным , но переписывать
банальные вещи с нуля утомляет, да и многие полезные Django батарейки уже не используешь.

Какие подходы и инструменты сейчас используют для написания фронтенда для Django?
    


Ответы

Ответ 1



Например, REST API, чтобы гонять данные, а на фронтенде любой модный фреймворк типа Angular/Ember/React+Backbone и т.д. Т.е. шаблонизатор джанги не используется (тем более, он и так довольно убог). Если же на сервере нет никакой сложной бизнес-логики, и он нужен только как БД и API к ней, а большая часть логики на клиенте, то джангу вполне можно заменить на что-то более подходящее.

Ответ 2



Я использую в проектах https://github.com/jrief/django-angular очень хороший и удобный инструмент, очень нравится как легко можно делать запросы к бэкенду, только желательно прикручивать serializers для ответов.

Ответ 3



Использую Django + Angular Light. Получается, где сложный интерфейс, там REST API и рендеринг на клиенте через Angular Light (админки с кучей таблиц, фильтры по объектам, прочий интерактив, вебсокеты и т.д.), в остальных частях системы (авторизации, витрины, контент страницы в том числе страницы с деталями объекта - используется Django шаблоны). К слову, Angular Light работает быстрее Angular 1.3, за счет того что там вырезан весь лишний обвес и используется встроенный в js пабсаб. Вот бенчмарк http://plnkr.co/edit/leZaT043Yffz4LfG8Ykq?p=preview

Ответ 4



От проекта зависит - используем и Angular и ExtJS

среда, 25 декабря 2019 г.

Выбор цветов для “ночной” темы

#android #gui #ui #color #material_design


Пишу погодное приложение. 

Для подбора цветов, чтобы следовать концепции Material Design, использовал ресурс
https://www.materialpalette.com/. 

Остановился на следующей цветовой схеме (см. рисунок ниже)

Сейчас решил добавить "ночную тему" (см рисунок ЕЩЕ ниже :-)

Я брал цвета "на глаз". 

Существуют какие-либо гайды или ресурсы для подбора цветов для ночных тем? Как правильно
подобрать цвета для ночной темы, следуя концепции Material Design?

Заранее спасибо




    


Ответы

Ответ 1



Нашел любопытную статейку по первому вопросу. Находим картинку в спокойных темных тонах Загружаем в pictaculous Profit

понедельник, 23 декабря 2019 г.

Книга по веб-стандартам? [закрыт]

#веб_программирование #книги #ui #документация


        
             
                
                    
                        
                            Закрыт. Данный вопрос необходимо конкретизировать. Ответы
на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он был сосредоточен только на одной проблеме, отредактировав его.
                        
                        Закрыт 1 год назад.
                                                                                
           
                
        
Подскажите, пожалуйста, хочу прочитать или книгу или документацию по веб-стандартам,
чтобы я мог аргументировать почему в форме справа кнопка сохранить, а слева отменить(это
например) и тд. 
Что посоветуете?
    


Ответы

Ответ 1



То, что вам нужно, называется User Interface Guidelines. Однако для web-а нет никаких документально зафиксированных рекомендаций, поэтому можете поискать подобные документы для широко используемых настольных операционных систем, опыт взаимодействия с которыми является стандартом де-факто: User Experience Guidelines для Windows, Human Interface Guidelines для OS X.

суббота, 14 декабря 2019 г.

Что это за кнопка?

#java #android #ui #android_button


Подскажите, что это за кнопка? Как она называется? И как такую сделать? 
    


Ответы

Ответ 1



Это switch button. Пример реализации. По ссылке: XML: Activity: import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView; public class MainActivity extends AppCompatActivity { Switch switchButton, switchButton2; TextView textView, textView2; String switchOn = "Switch is ON"; String switchOff = "Switch is OFF"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.switch_button_example); // For first switch button switchButton = (Switch) findViewById(R.id.switchButton); textView = (TextView) findViewById(R.id.textView); switchButton.setChecked(true); switchButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean bChecked) { if (bChecked) { textView.setText(switchOn); } else { textView.setText(switchOff); } } }); if (switchButton.isChecked()) { textView.setText(switchOn); } else { textView.setText(switchOff); } // for second switch button switchButton2 = (Switch) findViewById(R.id.switchButton2); textView2 = (TextView) findViewById(R.id.textView2); switchButton2.setChecked(false); switchButton2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean bChecked) { if (bChecked) { textView2.setText(switchOn); } else { textView2.setText(switchOff); } } }); if (switchButton2.isChecked()) { textView2.setText(switchOn); } else { textView2.setText(switchOff); } } } Как будет выглядеть:

понедельник, 25 ноября 2019 г.

Надо ли явно закрывать приложение?


Все мы знаем жизненный цикл Activity, основного кирпичика, из которого состоит Android приложение (по крайней мере обладающее UI).

Также мы знаем, что Activity может уничтожаться самой осью в зависимости от нагрузки/наличия памяти и проч. обстоятельств.

Бывают такие приложения (например приложения онлайн банкинга), которые требуют авторизации/входа
в этом случае, по аналогии с обычными десктоп приложениями напрашивается опция/кнопка/экшн - Выход/Exit/Quit, нажатие на которое приводит к гарантированному закрытию приложения. Например, такой паттерн используется в широко известном мобильном приложении "Сбербанк Онлайн". 

Другое чуть менее известное мобильное приложение от банка "Тинькофф", не используе
такой шаблон (вернее таки там можно выйти из приложения таким способом, но это запрятан
довольно глубоко), выход из приложения, в этом случае производится через системную кнопку back/назад - при достижении дна стека последних Activity - приложение само прекращает работу.

Внимание, вопрос: является ли использование специализированного действия выход/exit для Android приложений нормальным или это антипаттерн?
    


Ответы

Ответ 1



Кроме объектов Activity, есть еще объект Application, который по задумке авторо ОС в идеале должен жить вечно для приложения, единожды запущенного пользователем. И нет никакого "легального" программного способа уничтожить этот объект. Так что такого понятия "Выйти", как мы привыкли на компьютерах, нет вообще. Что касается приложений для онлайн-банкинга и других, работающих с закрытыми данными тут должно быть четкое и ясное для пользователя разграничение на зоны (открытая\защищенная) и явный переход между ними. Вход в защищенную зону с помощью ПИНа или логина-пароля, соответственно выход и нее по подтверждению (закончить? да-нет, либо явная команда "Выйти"). Само приложение может оставаться в памяти и даже на экране, главное чтобы все токен были удалены\отозваны, сессии закрыты и т.п. Это достаточный уровень безопасности для стандартного пользователя. Если же ваши пользователи настолько параноидальны либо требовательны, что мол в памят что-то осталось и т.п., то тут они ошиблись системой. Виртуальная машина не предоставляет настолько высокий уровень безопасности. И заморачиваться этим в приложении нет никакого смысла.

Ответ 2



Я считаю, что "культура выхода (входа)" из (серьезного) приложения специально должн быть выстроена таким образом, чтобы пользователю, который с опасением рассматривае быстрое и легкое взаимоотношение со своими активами , было предельно ясно когда и как открывается приложение, когда и как закрывается приложение. Выход кнопкой Назад из банковского приложения лично в меня вселял бы некоторое сомнение. Программисты реализующие подобные приложения вероятно учитывают психологию массового пользователя, либо им ставят задачу это (и наверняка многое другое) учитывать. Считаю специализированный выход/exit из специализированного приложения нормальным а значит и паттерном. В иных приложениях этот паттерн явно будет не востребован, став антипаттерном.

Ответ 3



Выход из приложения с освобождением ресурсов реально нужен в играх. При этом выхо не означает завершение всех сервисов, которые могут быть нужны в фоне. Для банковски приложений выход не из приложения, а из ЛК, где под паролем скрываются конфиденциальные/финансовые данные. В остальных случаях убиение андроидом вполне себе выход и отдельная кнопка там не нужна. upd Игры в массе своей грузят все ресурсы при старте и больше их не выгружают. Избегая таким образом, вызовов сборщика мусора, гарантируя при этом отсутствие лагов из-за gc. Бывает, что отдельные сцены догружаются и выгружаются по мере необходимости (уровни, например). Поскольку загрузка и выгрузка занимает довольно длительное время, лучше у пользовател лишний раз спросить о выходе, чем загружать все по новой из-за случайного нажатия back. И кнопка выход в меню (по кнопке back или по кнопке в интерфейсе) должна нажиматься осознанно. Верно и с другой стороны, если пользователь наигрался, то ни к чему держать в памят сотни мегабайт загруженных ресурсов, да еще если логика какая-то считается в фоне притом, сжирая батарейку, то пользователь должен иметь возможность выйти из игры совсем - по кнопке. К сожалению, игрописатели, бывает, пренебрегают освобождением ресурсов, оставля при этом работающие в фоне сервисы для отображений нотификаций, опроса сервера на предме обновлений и новых событий, хорошо если потребление памяти и процессора (батареи) такими сервисами не сильно большое... По этой же причине так популярны всяческие taskkiller'ы и проч.

Ответ 4



Действительно ОС Андроид сама заботится о закрытии приложений с которыми работа пользователь и занимается "сопровождением" жизненного цикла приложения. Дать однозначный ответ является ли использование кнопки «выход» паттерном или антипаттерном нельзя. Все зависит от того как грамотно ее реализацию применяют разработчики. В руководстве по material design в разделе посвященном usability – accessibilit , можно найти информацию о том, что навигация в приложении должна быть построена таким образом, чтобы она давала пользователю уверенность и понимание где он находится в вашем приложении. В приложениях, которые работают с важной для пользователя информацией (финансовы приложения, работа с данными в облаке и т.п.), кнопка «выход» означает не только закрыти самого приложения, но выполняет еще и определенный дополнительный функционал (автоматическо закрытие сессии при использовании мобильного банка, выход из «облака» и т.п.). В приложениях такого типа желательно показать пользователю, что он работает в некой закрытой, защищенной среде и усилить его уверенность в том, что это безопасно. При этом кнопка «выход» четко показывает границу защищенной среды. А ее использование позволит еще более обезопасить работу с приложением, затруднит атаки злоумышленников на него. Есть еще один способ использования кнопки «выход», когда по умолчанию от пользовател она скрыта, но при определенных настройках она появляется в меню. Реализацию таког способа можно увидеть на примере браузера Firefox для ОС Андроид. При этом она также помимо закрытия самого приложения кнопка «выход» также выполняет дополнительный функционал (удаление данных настраиваемых пользователем). Как видно и в первом и во втором случаях кнопка «выход» не только улучшает взаимодействи с приложением, но и реализует дополнительный функционал придающий простоту использования определенных функций безопасности. В приложениях которые выполняют определенный функционал в фоновом режиме,также уместн использование кнопки "выход". Реализация кнопки должно давать четкое понимание, что при её нажатии приложение полностью закрывает как пользовательский интерфейс так и все фоновые процессы. Таким образом, можно сделать вывод, что если кнопка «выход» добавляет уверенност пользователю при работе с приложением, облегчает использование определенного функционала улучшает навигацию в нем, то в этом случае ее реализацию в приложении можно назвать паттерном. Если же реализация кнопки «выход» только нагружает пользователя дополнительными действиями, не привнося ни какой дополнительной полезной нагрузки, то такую реализацию можно назвать скорее антипаттерном.

Ответ 5



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

Ответ 6



Судя по тому, что говорит документация, переопределение поведения по умолчанию для кнопки назад (как и других аппаратных кнопок) - моветон: Внимание! В большинстве приложений не следует прерывать поведение операций и задач по умолчанию. Если вы обнаружили, что вашей операции необходимо изменить поведение по умолчанию, будьте внимательны и протестируйте удобство работы с операцией во время запуска и при обратной навигации к ней из других операций и задач с помощью кнопки Назад. Обязательно протестируйте поведение навигации, которое может противоречить поведению, ожидаемому пользователем. То есть, определённо не стоит наделять аппаратную кнопку "Назад" возможностью выхода из приложения. :) Что касается остальных случаев... Существует мнение, что не стоит принудительно закрывать приложения, и речь идёт даже не о программном закрытии приложений. Вот интересная статья на эту тему (статья про iOS, но, по-моему, применительно Andoid это тоже работает) и мой вольный перевод: Принудительное закрытие приложений, когда они не испытывают проблем, не является хорошей идеей по нескольким причинам. ... Для телефона так проще открывать приложения и это экономит батарею, если приложения недавно использовалось. Если же вы закрыли все свои приложения, каждый раз, когда вы снова открываете приложения, телефон загружает их в режиме cold booting из полностью закрытого состояния. Это нагружает процессор и батарею. И небольшая иллюстрация из этой же статьи: Таким образом, есть основание полагать, что программно закрывать приложение тем боле не стоит. Не буду утверждать, что это мнение единственно правильное, но, как минимум, оно достаточно интересное.

Ответ 7



Я считаю что однозначный выход из приложения должен быть с точки зрения юзабилити а вот будет это реальный выход, или уход в паузу/фон другой вопрос. А именно зависи уже от того что делает приложение. Потому что, сейчас, например масса приложений у которы явного выхода нету, и их приходится принудительно "выходить" из-за того что они перестают внятно работать без этого в виду тех или иных причин. В идеальной картине мира, конечно хорошо когда ОС сама решает как правильнее, но пока гугл не встроил ИИ в телефоны, без этого не обойтись.

Ответ 8



Я думаю что пользователь должен иметь возможность явного выхода из приложения, те более в онлайн приложениях где есть серьёзные личные данные - это на уровне психологи успокаивает пользователя что он вышел и его данные никто не перехватит, и перед закрытием приложения выполнять все необходимые действия по выходу из аккаунта, закрытию сессии и т.д.. Мне кажется что наличие простого и удобного способа выхода из приложения "из коробки" - недочёт разработчиков гугла.

среда, 17 июля 2019 г.

Как распределить логику между классами UI

У меня есть класс которые в себе содержит логику RecyclerView, также в этом классе содержится логика меню, а помимо этого еще toolBar и другие компоненты UI.

Можно ли перенести логику меню в отдельный класс, toolBar соответственно, а в основном классе RecyclerViewActivity объединить их для работы с R.layout.recyclerview_activity?


Ответ

Можете, если я правильно понимаю вопрос. Необязательно для этого отдельный класс, если вы используете Kotlin , можно сделать через extensions
Конкретно для вашего примера, кусок кода и реализацию с помощью extension можете посмотреть здесь - репозиторий с кодом на github
update: Я вижу что человек поставил мне -1 за ответ. Просто если вы хотите вынести логику из вашего Activity(Fragment), то конечно нужно посмотреть в сторону MVC, MVVM, MVP. Каждый из них стоит применять в зависимости от задачи, но я бы рекомендовал MVP, как по мне он более универсальный.
Вот отличный tutorial, как можно реализовать MVP без библиотек: ссылка на гайд

понедельник, 15 июля 2019 г.

Как вызвать кнопку созданную в другом классе

Необходимо соединить через сигналы и слоты кнопку которая находиться в классе connection. Вызвать я ее хочу в классе MainWindow и там же слот. Вопрос как прописать указатель на обьект кнопку вначале connect.
Вот кратки пример кода для понимания
Class MainWindow .cpp { connection = new Connection(this); connect(connection.ui?,SIGNAL(pressed(bool)), this, SLOT(test_slot())); }
А в классе connection запилена кнопка созданная в дизайнере П.С. классы соедены корректно.


Ответ

У вас кнопка является атрибутом класса. И логично что приватным. Вам нужно организовать геттер возвращающий указатель на кнопку, и этот геттер в коннект и прописать первым аргументом. Что то вроде
connection = new Connection(this); connect(connection->p_getButton(),SIGNAL(pressed(bool)), this, SLOT(test_slot()));
Но в общем мне кажется у вас нарушенна MVC модель. У вас графическое представление похоже является частью контроллера (connection)

понедельник, 10 июня 2019 г.

Локализация JFileChooser через UIManager. Где найти ключи локализации?

Пытаю локализовать JFileChooser через UIManager. Делаю это вот так:`
UIManager.put("FileChooser.saveButtonText", "Сохранить"); UIManager.put("FileChooser.cancelButtonText", "Отмена"); UIManager.put("FileChooser.fileNameLabelText", "Наименование файла"); UIManager.put("FileChooser.filesOfTypeLabelText", "Типы файлов"); UIManager.put("FileChooser.lookInLabelText", "Директория"); UIManager.put("FileChooser.saveInLabelText", "Сохранить в директории"); UIManager.put("FileChooser.folderNameLabelText", "Путь директории");
И далее, где то 20 строк. Но не могу найти всех ключей к FileChooser. Кто-нибудь знает где они?


Ответ

Список можно получить из из ресурсов Swing в зависимости от используемого Look&Fill.
Например: basic
В пакете com.sun.java.swing.plaf есть пакеты под различные локали различных look&fill. Открыв их можно собрать все ресурсы начинающиеся с FileChooser.
Кроме того там есть ресурсы и для прочих стандартных диалогов.

пятница, 7 июня 2019 г.

Изменение кастомного макета для Spinner'a после его создания

Можно ли как-нибудь изменить кастомный макет для Spinner'a после его создания? Например, у меня есть Spinner, макет которого состоит из TextView и ImageView




наполнение его выглядит так:
Spinner spinner = findViewById(R.id.spinner_sorting); ArrayAdapter spinnerAdapter = new ArrayAdapter(this, R.layout.spinner_row, R.id.tv_sorting, getResources().getStringArray(R.array.sorting_array)); spinner.setAdapter(spinnerAdapter);
и в итоге Spinner выглядит следующим образом:

А мне хотелось бы изменить каждую вторую ImageView в этом Spinnere. Как это можно сделать?


Ответ

Создала кастомный адаптер для Spinner-a:
public class SortingSpinnerAdapter extends ArrayAdapter { private LayoutInflater inflater; private Context context; private String[] data;
public SortingSpinnerAdapter(@NonNull Context context, int resource, int textViewResourceId, String[] data) { super(context, resource, textViewResourceId, data); inflater = LayoutInflater.from(context); this.context = context; this.data = data; }
@Override public View getView(int position, View convertView, ViewGroup parent) { return createView(position, convertView, parent); }
@Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { return createView(position, convertView, parent); }
private View createView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.spinner_row, parent, false); holder = new ViewHolder(); holder.textView = convertView.findViewById(R.id.tv_sorting); holder.imageView = convertView.findViewById(R.id.iv_arrow); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } onBindViewHolder(holder, position); return convertView; }
private void onBindViewHolder(ViewHolder holder, int pos) { holder.textView.setText(data[pos]); if (pos % 2 == 0) { holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.arrow_downward)); } else { holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.arrow_upward)); } }
static class ViewHolder { TextView textView; ImageView imageView; } }
В итоге получила именно то, что хотела:

четверг, 16 мая 2019 г.

Как реализовать UI как в Scratch

Сегодня в Google Play наткнулся на интересную программу, конструктор, в котором были реализованы кубики (не знаю как они называются) как на картинке.

Вот мне стало интересно, а как такие вещи реализовывать?


Ответ

Концепция. Каждое действие (цикл, условие, арифметика) - это отдельный класс, унаследованный от родительского класса ParentAction. У каждого класса есть своя реализация. Для каждого блока - у вас переопределен метод исполнения. Параметры передаются в конструктор класса.
abstrast class ParentAction() { abstract fun execute(child: ParentAction) }
Разберем простой пример: вывести в цикле 5 раз некоторую строчку. В UI части - пользователь собирает два блока, один вложенный в другой. Проходя его дерево блоков изнутри-наружу, мы собираем верную цепочку, последовательность исполнения блоков. В данном примере класс Printf - минимальное действие. Им нельзя ничего обернуть. Смотрите классы ниже:
сlass Foreach(private val count: Int, child: ParentAction): ParentAction { override fun execute() { for(i : 0..count) { child.execute() } } }
Класс Printf:
сlass Printf(private val str: String): ParentAction { override fun execute() { print(str) } }
Тогда, при обратном прохождении дерева пользователя, мы получаем:
Генерируем объект класса Printf с указанными пользователем параметрами Генерируем объект класса Foreach и передаем ему на вход класс Printf, дабы тот, запускал его внутри себя. Запускаем метод execute у класса Foreach.
Все. Шарманка закрутилась. Для реализации математики, вам придется организовать работу с "памятью", дабы разные классы могли последовательно читать из общего источника. В итоге, у вас получается простой компилятор, "надстройка". Конечно, все зависит от вашей задачи. Если вы хотите создать программу для обучения детей основам программирования, то данная реализация уместна. Если же вы хотите разработать графический язык программирования, то вам следует углубиться в разработку собственного компилятора, т.к. данная надстройка не будет отличать высокой эффективностью. Удачи!

пятница, 29 марта 2019 г.

UI потоки в java

Что такое UI потоки в Java? В чем их отличие от обычных потоков Thread?


Ответ

UI поток - обычный поток, но в нем и только в нем следует обновлять состояние вашего GUI или его элементов. Как правило представляет собой поток извлекающий из очереди задачи для обновления или перерисовки интерфейса. Если вам надо обновить ваш GUI не из UI потока, то как в Swing так и в JavaFX есть методы, которые добавляют задачи по добавлению GUI в эту очередь. Сделано так для того, что бы не занимать синхронизацией обращений к элементам интерфейса и не допустить параллельного выполнения операций над ним.

суббота, 23 марта 2019 г.

Научиться JavaScript [закрыт]

Здравствуй, сообщество (: Хочу изучить JavaScript, знаю несколько языков, имею огромный опыт веб-разработки, но до JS руки так и не дошли, постоянно брал откуда-то готовые примеры, никогда специфического ничего не требовалось. Но сейчас я хочу закрыть эту большую дыру и творить! (: Мне не нужны начальные теоретические знания: циклы, условия, ооп и тому подобные конструкции - теорию я уже знаю. Я хочу боевых скринкастов / видеоуроков, мануалов, уроков или чего нибудь такого, где сразу без занудства будут описывать анимации, события, применение конкретных фреймворков - и их объектов и методов, или просто что нибудь красивое (: В общем нужны пособия по UI / UX. Английский язык не проблема - если есть что-нибудь стоящее - предлагайте! С удовольствием посмотрю / почитаю. Заранее огромное спасибо! UPD: Прошло чуть меньше года, с момента как я задал этот вопрос, и я до сих пор изучаю все прелести JS. Тем, кто задаётся похожей целью, и тоже считает, что ему не нужны теоретические знания о JS - Вы, как и я раньше, ошибаетесь. JavaScript - прекраснейший язык, в нём много отличий от обычных ОО языков. Тут тебе и сплошь объекты, и прототипы, и события... В общем - начинайте с низов, и будет Вам счастье.


Ответ

Мне не нужны начальные теоретические знания "JavaScript Шаблоны" уже рекомендовали так что: JavaScript Web Applications Learning JavaScript Design Patterns прочее: Что почитать, чтобы повысить свой уровень JavaScript ECMA-262-3 in detail wtfjs по UI / UX. Ководство Психбольница в руках пациентов

понедельник, 19 ноября 2018 г.

Книга по веб-стандартам? [закрыт]

Подскажите, пожалуйста, хочу прочитать или книгу или документацию по веб-стандартам, чтобы я мог аргументировать почему в форме справа кнопка сохранить, а слева отменить(это например) и тд. Что посоветуете?


Ответ

То, что вам нужно, называется User Interface Guidelines. Однако для web-а нет никаких документально зафиксированных рекомендаций, поэтому можете поискать подобные документы для широко используемых настольных операционных систем, опыт взаимодействия с которыми является стандартом де-факто:
User Experience Guidelines для Windows, Human Interface Guidelines для OS X.

вторник, 23 октября 2018 г.

Что это за кнопка?

Подскажите, что это за кнопка? Как она называется? И как такую сделать?


Ответ

Это switch button
Пример реализации
По ссылке:
XML








Activity
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Switch switchButton, switchButton2; TextView textView, textView2; String switchOn = "Switch is ON"; String switchOff = "Switch is OFF";
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.switch_button_example);
// For first switch button switchButton = (Switch) findViewById(R.id.switchButton); textView = (TextView) findViewById(R.id.textView);
switchButton.setChecked(true); switchButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean bChecked) { if (bChecked) { textView.setText(switchOn); } else { textView.setText(switchOff); } } });
if (switchButton.isChecked()) { textView.setText(switchOn); } else { textView.setText(switchOff); }
// for second switch button switchButton2 = (Switch) findViewById(R.id.switchButton2); textView2 = (TextView) findViewById(R.id.textView2);
switchButton2.setChecked(false); switchButton2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean bChecked) { if (bChecked) { textView2.setText(switchOn); } else { textView2.setText(switchOff); } } });
if (switchButton2.isChecked()) { textView2.setText(switchOn); } else { textView2.setText(switchOff); } } }
Как будет выглядеть:

понедельник, 1 октября 2018 г.

Надо ли явно закрывать приложение?

Все мы знаем жизненный цикл Activity, основного кирпичика, из которого состоит Android приложение (по крайней мере обладающее UI).
Также мы знаем, что Activity может уничтожаться самой осью в зависимости от нагрузки/наличия памяти и проч. обстоятельств.
Бывают такие приложения (например приложения онлайн банкинга), которые требуют авторизации/входа, в этом случае, по аналогии с обычными десктоп приложениями напрашивается опция/кнопка/экшн - Выход/Exit/Quit, нажатие на которое приводит к гарантированному закрытию приложения. Например, такой паттерн используется в широко известном мобильном приложении "Сбербанк Онлайн".
Другое чуть менее известное мобильное приложение от банка "Тинькофф", не использует такой шаблон (вернее таки там можно выйти из приложения таким способом, но это запрятано довольно глубоко), выход из приложения, в этом случае производится через системную кнопку back/назад - при достижении дна стека последних Activity - приложение само прекращает работу.
Внимание, вопрос: является ли использование специализированного действия выход/exit для Android приложений нормальным или это антипаттерн?


Ответ

Кроме объектов Activity, есть еще объект Application, который по задумке авторов ОС в идеале должен жить вечно для приложения, единожды запущенного пользователем. И нет никакого "легального" программного способа уничтожить этот объект. Так что такого понятия "Выйти", как мы привыкли на компьютерах, нет вообще.
Что касается приложений для онлайн-банкинга и других, работающих с закрытыми данными, тут должно быть четкое и ясное для пользователя разграничение на зоны (открытая\защищенная) и явный переход между ними.
Вход в защищенную зону с помощью ПИНа или логина-пароля, соответственно выход из нее по подтверждению (закончить? да-нет, либо явная команда "Выйти").
Само приложение может оставаться в памяти и даже на экране, главное чтобы все токены были удалены\отозваны, сессии закрыты и т.п. Это достаточный уровень безопасности для стандартного пользователя.
Если же ваши пользователи настолько параноидальны либо требовательны, что мол в памяти что-то осталось и т.п., то тут они ошиблись системой. Виртуальная машина не предоставляет настолько высокий уровень безопасности. И заморачиваться этим в приложении нет никакого смысла.