Страницы

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

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

Переход во фрагмент при нажатии на кнопку

Всем добрый вечер, уже какой день мучаюсь с этими фрагментами, все никак не могу реализовать, например, у нас есть активити, на нем расположена кнопка, и при нажатии на нее, сразу же открывается новое окно фрагмент. Вот в этом приложении так реализовано. https://play.google.com/store/apps/details?id=com.formul.fizik&hl=ru Нажимаем и открывается. Обновление Дело в том, что реализовать переход из одного активити в другое активити, проблем нет, но я никак не пойму, как с помощью фрагментов можно сделать быстрый переход, возьмем тот же справочник, который выше. При нажатии на кнопку, мгновенно открывается содержание определенной темы. К сожалению ошибка http://joxi.ru/GrqBoweHQnpGmz Ошибку исправил, но у меня получается при нажатии на фрагмент появляется фрагмент, и кнопки остаются, и я могу нажать еще раз и еще раз на кнопку и так кол-во раз, появится фрагмент. Обновление 2 Я исправил импорт с import android.support.v4.app.Fragment; на import android.app.Fragment; - ошибка пропала. Я создал layout: activity_main и fragment. Fragment1.class и MainActivity В Fragment.class я прописал public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment1, null); } } А в MainActivity заскринил http://joxi.ru/1A5J4n9tn0BprE Так же fragment.xml http://joxi.ru/Y2LDVWqH9wyJ26 activity_main http://joxi.ru/l2ZYByVHwDKGmJ


Ответ

Принцип тут такой: 1) В разметке активити есть контейнер (FrameLayout, например) с id="yours_id". 2) В активити, при нажатии на кнопку, добавляем фрагмент в контейнер: Fragment yoursFragment=new YoursFragment(); FragmentTransaction trans=getFragmentManager().beginTransaction(); trans.add(R.id.yours_id, yoursFragment); trans.commit(); 3) Чтобы всё это работало, вам скорее всего придётся переделать всю логику активити под фрагменты (т.е. кнопка, запускающая открытие фрагмента тоже должна быть во фрагменте, и оба фрагмента должны быть в одном контейнере); Обновление Если же вы хотите, чтобы на экране "исчезали" все кнопки и 1-й фрагмент появлялся поверх всего, то вам надо сами кнопки встроить в другой фрагмент. Далее при старте активити добавлять фрагмент с кнопками (в FrameLayout), а при нажатии на одну из них делать trans.replace(R.id.yours_id, frag1); trans.addToBackStack(null); trans.commit(); Так у вас будет всё содержимое с экрана по нажатию кнопки заменяться на frag1, а при нажатии на кнопку "назад" показываться опять фрагмент с кнопками.

Как использовать LIB от другого компилятора?

Имеется LIB, собранная в BC3.1, она использует его RTL. Собственно, вопрос заключается в том, как воспользоваться этой библиотекой в другом компиляторе? Исходников библиотеки, понятное дело, нет. Есть ли способ собрать "добавку" в BC3.1 к этой библиотеке, которую потом спокойно использовать в другом компиляторе?


Ответ

Вам необходимо будет сделать библиотеку-прослойку. Поскольку исходная lib использует RTL, взаимодействовать с нею нужно только компилятором версии, в которой она была собрана. Соответственно, при помощи этого компилятора необходимо собрать новую библиотеку, которая будет клиентом к исходной, предоставлять интерфейс к функциональности исходной, и этот интерфейс должен удовлетворять ряду "переносимых" критериев: "Ansi C" интерфейс. Т.е. никаких экспорта классов, никакого экспорта STL и т.п.. Экспорт только функций, входные и выходные параметры только стандартные типы. Никаких include-ов стандартных библиотек. Если Вы сделаете один header, в идеале ему вообще не нужно содержать сторонних include-ов. Если содержит, в идеале это "Ansi C", как, например, "windows.h" (могу ошибаться, но, вроде бы, он без включений STL, классов и т.п.) Библиотека не будет бросать никакие exception. Все их от исходной необходимо обрабатывать, но не пробрасывать выше. Перехвать exception компиляторозависим. Вся память, выделяемая внутри библиотеки, должна освобождаться внутри библиотеки. Если где-то управление жизнью выделенной памяти передается клиенту, то интерфейсу надо иметь функцию, которая будет позволять освобождать такую память. Лучше отказаться от абстрактных структур. Теоретически это не должно быть проблемой, но многие детали реализации виртуализации не стандартизированы, а значит компиляторы могут выполнять их по-разному, и это на практике (у меня между MinGW и VS разных версий, хотя между разными компиляторами MinGW и между разными VS такой проблемы не наблюдал) приводит к проблемам. Вроде бы ничего не забыл.

Android ViewPager как пролистывать напопловину?

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


Ответ

viewpager.setClipToPadding(false) viewpager.setPadding(left,0,right,0) Где left и right - ширина "куска" левого и правого фрагментов, которые будут показываться одновременно с основным. Если нужно добавить также и отступ между фрагментами: viewpager.setPageMargin(int)

Как в JS вставить разметку HTML?

Всем привет. Подскажите, как в JS вставить HTML блок с содержимым? Например:

Текст текст
Текст текст

Так оно почему-то не работает, а как правильно, чтобы потом подключил этот файл и оно читало разметку?


Ответ

http://jsfiddle.net/aqjLk2yk/ http://jquery-docs.ru/attributes/html/ http://jquery-docs.ru/attributes/text/

Не сохраняется добавление записи в БД, EF

Есть банальная табличка
Создана она как локальная база (.mdf) Пишу добавление:
ProjEntities context = new ProjEntities(); context.Tables.Add(new Table { ProductName = "Book", Price = 85 });
context.SaveChanges();
Изменения не добавлялись в базу. Хотя, если сразу за сохранением с контекста выбрать записи в список, то добавленная запись есть.


Ответ

Под локальной базой обчыно подразумевается подключение к SQL Express / SQL Local DB с указанием AttachDBFileName = |DataDirectory|\mydatabase.mdf
|DataDirectory| в случае не-ASP.NET приложения означает "та папка, в которой лежит exe файл". Т.е. это скорее всего не папка проекта, в которой лежат исходники, а папка bin.
Т.е. при указании пути через |DataDirectory| программа работает не с mdf-файлом, добавленным в проект, а с его копией в bin.
Это не является спецификой EF, то же самое происходит и при ручной работе с SQL через ADO.NET.
Поэтому при таком способе подключения обычно проявляются две связанных проблемы.
Проблема 1: изменения, внесенные программой "не видны" в базе данных. Причина: программа работает с копией файла в bin, а разработчик проверяет на наличие изменений оригинал в папке проекта. Решение: исправляется просмотром файла из bin. Проблема 2: изменения, внесенные программой, теряются при перезапуске программы из студии (по F5 / Ctrl + F5). Причина: - mdf файл по умолчанию добавляется проект с Build Action = Content, и настройкой Copy To Output Folder = Always. Это означает, что при перестроении приложения (при повторном его запуске из студии) файл базы из проекта копируется в папку bin, заменяя лежащий там файл, в который были сохранены данные при прошлом запуске. Решение: исправляется сменой значения Copy To Output Folder для mdf-файла в проекте на If Newer.

Алгоритм распознавания состояний глаз - открыты/закрыты

Добрый день. Требуется реализовать алгоритм, позволяющий определять, в каком состоянии находятся его глаза, если можно так выразиться. Нужно определять состояния Открыты, Закрыты, можно еще Закрыты на хх%. Буду признателен за подсказки, где можно про это почитать.
UPD Прошу только навести, где есть информация о распознавании глаз.


Ответ

Задача очень нетривиальна и, предваряя поиск решения, требует конкретизации условий, в которых необходимо производить детекцию моргания или просто текущего состояния глаз в кадре: открыты или закрыты.
Возьмём, к примеру, стандартный случай.
Если на исходном изображении лицо не заполняет всю видимую область, то таковую необходимо локализовать. Для решения этой задачи существует не так уж и много решений, но то, что имеется в подавляющем количестве случаев более чем удобоваримо. Речь прежде всего о каскаде Хаара. Во многих фреймворках, так или иначе касающихся тематики компьютерного зрения, имеется реализация данного инструмента, позволяющая с относительно высокой точностью локализовать местоположение лица в кадре.
После нахождения региона, содержащего лицо, уже в нём необходимо локализовать местоположение обоих глаз. Как правило, начав с каскада Хаара в случае с лицом, не останавливаются в использовании этого же инструмента и для глаз. Просто берут соответствующий файл классификатора, заранее обученный на поиск желаемого типа объекта. К слову сказать, оба типа классификаторов (для лиц, глаз, да и других объектов) имеются во многим известном фреймворке OpenCV, ориентированном как раз на решение задач, навроде той, что встала перед автором вопроса.
Не стану останавливаться на задаче, как реализовать детекторы лиц и глаз посредством каскада Хаара (метод Виолы-Джонса) в том же OpenCV, так как об этом расписано в сети, наверное, вдоль и поперёк, да и вопрос конкретно не затрагивает эту область.
Предположим, что после применения алгоритмов детекции мы получили следующие изображения, отражающие два состояния глаз: открыты и закрыты.

Изображения мною взяты исключительно для примера, но в реальности, если съёмка ведётся с обычной вебкамеры, области глаз получаются значительно меньше. Это просто в следствие того, что специально подносить собственную физиономию близко к объективу редко у кого возникает желание. Но именно в следствие этого (условий съёмки, упоминаемых мною в самом начале) как правило и начинаются расхождения в подходах к определению местоположения зрачка.
Методов по детекции зрачка разработано довольно много. От самых простых, до комплексных. Очень многие подробно расписаны (к сожалению в подавляющем большинстве случаев на английском). А для некоторых имеется и вполне свободный доступ к исходникам. На том же гитхабе можно обнаружить довольно много различных решений. Например такое или такое. Последнее, кстати, не требует локализации области глаз, только лишь лица.
Вообще, детекция зрачка кажется очевидным путём для решения поставленной задачи: зрачок есть - глаз открыт, нет зрачка - глаз закрыт. Но у многих методов, идущих этим путём, имеется проблема с детекцией в том случае, если глаз полуприкрыт или закрыт вовсе. В этом случае происходят ложные срабатывания алгоритмов и те выдают местоположение зрачка аккурат на ресницах, "лежащих" на соединении верхнего и нижнего века. То есть, искомое состояние о закрытии глаза способны выдавать далеко не все методы.
Для решения этой проблемы можно использовать машинное обучение или даже предварительно сделать образцы открытого и закрытого глаз, а затем сравнивать с этими шаблонами новые кадры. Но можно пойти и от обратного, например, применив самый простой детектор кожи. Очевидно, что если глаз закрыт, цветом кожи будет покрыто практически всё изображение глаза, а если открыт, то далеко не всё.
int main() { // Загрузить изображения открытого и закрытого глаз из файлов. cv::Mat eye_opened_mat = cv::imread("eye-opened.jpg"); cv::Mat eye_closed_mat = cv::imread("eye-closed.jpg");
// Показать, что загрузили в отдельных окошках. cv::imshow("eye-opened", eye_opened_mat); cv::imshow("eye-closed", eye_closed_mat);
// Сконвертировать цветовое пространство изображений в YCbCr. cv::Mat opened_mat, closed_mat; cv::cvtColor(eye_opened_mat, opened_mat, cv::COLOR_BGR2YCrCb); cv::cvtColor(eye_closed_mat, closed_mat, cv::COLOR_BGR2YCrCb);
// Изъять из картинок указанные диапазоны значений пикселей // для каждого из цветовых каналов YCbCr. cv::inRange(opened_mat, cv::Scalar(0,133,77), cv::Scalar(255,173,127), opened_mat); cv::inRange(closed_mat, cv::Scalar(0,133,77), cv::Scalar(255,173,127), closed_mat);
// Показать результат в отдельных окошках. cv::imshow("grd-opened", opened_mat); cv::imshow("grd-closed", closed_mat); cv::waitKey();
return 0; }
Этот код использует OpenCV. Результат будет следующий:

Разница между закрытым и открытым глазами очевидна и не составит никакого труда алгоритму выдать правильный ответ о состоянии глаза. Преимуществом данного подхода является скорость. Работает он очень быстро. Недостаток: чувствительность к перепадам освещённости, ну и конечно к неграм (без обид), для цвета кожи которых придётся подбирать иные коэффициэнты.

Как последовательно запустить несколько процессов, а код завершения последнего потомка передать первому процессу?

Добрый вечер. Подскажите как правильно выполнить задачу? Необходимо создать цепочку из 5 последовательно запущенных процессов, когда каждый дочерний процесс становится родителем для следующего потомка. Код завершения последнего потомка передать первому процессу. В первом процессе вывести данное число на экран.
Создал в цикле 5 процессов:
pid_t return_value;
for(int i = 0; i < 5; i++) { return_value = fork(); printf("%s %d %s %d
", "Процесс: ", getpid(), "PID: ", return_value); }
return 0;
Данный код выдает мне в терминале огромную простыню,
Я так понимаю что это из-за того, что после создания нового процесса они продолжают выполняться параллельно. Как код завершения последнего потомка передать первому процессу так и не выяснил. Подскажите как правильно сделать?


Ответ

Надеюсь, Вы уже сами успешно решили свою задачку, но на всякий случай вот простой код.
#include #include #include #include
int main (int ac, char *av[]) { int n = 5, s; srand(getpid());
while (n--) if (fork()) break;
if (n < 0) { // last child s = rand() % 100; printf("child %d exit rc: %d
", (int)getpid(), s); exit(s); }
wait(&s); if (n != 4) // all except first exit(WEXITSTATUS(s));
printf("Grandfather %d: child exited: %d
", (int)getpid(), WEXITSTATUS(s));
return puts("End") == EOF; }
Т.е. делаем цикл по переменной (в коде -- n), которая наследуется новым процессом и в нем запускаем новый процесс. Родитель выходит из цикла, ждет завершения потомка (тот в свою очередь ждет завершения своего потомка и так 5 раз). Если это не прародитель (определяем по n), то выходим с кодом завершения потомка, который получили в wait()
(без pipe передать PID последнего процесса в первый не получится (конечно, кроме разделяемой памяти или файла), но это мы с Вами вроде уже обсуждали).