Как отразить фрагмент в презентации на Android?

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

Итак, моя цель - отобразить ОДИН конкретный фрагмент на внешнем дисплее при подключении устройства. Очевидно, я нашел красивую презентацию проекта cwac из Commonsware: https://github.com/commonsguy/cwac-presentation

Мне удалось запустить демонстрацию SimpleMirrorActivity и WebMirrorActivity, которые отображают соответственно зеркало EditText< /em> и веб-страница в том же макете.

Затем я посмотрел, как работает класс MirrorPresentationActivity, и смог его запустить. Он отображает веб-страницу на внешнем дисплее.

Но моя цель - отобразить один конкретный фрагмент, и я не думаю, что есть пример этого. Я много раз читал описание MirrorPresentationFragment, но так и не понял, как его запустить.

Можно ли получить один пример или несколько объяснений, чтобы сделать это?

Спасибо, это мне очень поможет.


person azn0viet    schedule 08.12.2014    source источник
comment
У вас есть код, чтобы показать? Что не работает так, как вы пробовали? Какие-то конкретные ошибки?   -  person Janis F    schedule 08.12.2014
comment
Спасибо за ответ, однако мой код совсем не хорош, потому что я просто пытаюсь понять, как он работает и как запустить образец. Я собираюсь попробовать больше с ответом CommonsWare и вернуться, когда у меня будет правильный код! Спасибо еще раз.   -  person azn0viet    schedule 08.12.2014


Ответы (1)


Шаг № 1: Преобразуйте свой «один конкретный фрагмент» в подкласс MirroringFragment. Цитирование документации:

MirroringFragment работает так же, как обычный фрагмент. Однако вместо переопределения onCreateView() вы переопределяете onCreateMirroredContent(). onCreateMirroredContent() принимает те же параметры, что и onCreateView(), и ваша задача такая же: создать контент, который будет отображаться фрагментом. Разница в том, что возвращаемый View будет заключен в MirroringFrameLayout.

Используйте MirroringWebViewFragment в качестве примера того, как это должно выглядеть. Или просто используйте MirroringWebViewFragment напрямую, если ваш «один конкретный фрагмент» оказался WebViewFragment.

Шаг № 2: Создайте и используйте файл MirrorPresentationFragment. Цитирование документации:

MirrorPresentationFragment — это PresentationFragment, предназначенный для отражения содержимого MirroringFragment. Чтобы использовать это, создайте экземпляр с помощью фабричного метода newInstance(), взяв в качестве параметров контекст и желаемый дисплей. Затем вызовите setMirror() для вашего MirroringFragment, предоставив MirrorPresentationFragment. Оттуда вы можете показать() и отклонить() MirrorPresentationFragment, как и любой другой PresentationFragment. Имея MirroringFragment на главном экране и MirrorPresentationFragment на внешнем дисплее, все, что пользователь манипулирует на экране, отображается на внешнем дисплее, что идеально подходит для настроек презентации (например, конференций).

Инструкции по использованию PresentationFragment в целом (подклассом которого является MirrorPresentationFragment) см. в документация. MirrorPresentationActivity демонстрирует использование MirrorPresentationFragment.

Шаг № 3: Пиво.

person CommonsWare    schedule 08.12.2014
comment
Могу я просто перейти к № 3? - person Janis F; 08.12.2014
comment
Спасибо за быстрый ответ и за ваш проект! Я не понял первый шаг, поэтому я попробую еще раз. Спасибо :) - person azn0viet; 08.12.2014
comment
@azn0viet: Вполне возможно, что вы обнаружите, что ваши варианты использования не совпадают с тем, что может предложить библиотека. Если это так, отправьте запрос функции в системе отслеживания проблем проекта. - person CommonsWare; 08.12.2014
comment
Я надеюсь, что это не так, моя цель кажется такой легкой, но в конце концов это не так! Тем не менее, мне наконец удалось запустить ваш пример как фрагмент, и это уже большой шаг. Спасибо, я продолжу завтра и дам вам знать, если/когда я смогу делать то, что хочу :) - person azn0viet; 08.12.2014
comment
Через один день мне удалось сделать то, что я хочу, однако это все еще сложно для меня, и поэтому я буду продолжать изучать, как это работает, на других примерах! Спасибо за вашу помощь :) - person azn0viet; 09.12.2014
comment
@CommonsWare Привет и с Новым годом тебя! Что касается моего проекта, то мне удалось почти сделать то, что я хочу, то есть вывести зеркало фрагмента на внешний экран. Однако размер фрагмента на основном экране меняется и принимает тот же размер, что и дублированный (размер экрана). Вас это не беспокоит? Или лучше так? Иначе можно ли (в библиотеке) адаптировать размер зеркалирования, а не основного фрагмента? Большое спасибо! - person azn0viet; 13.01.2015
comment
@azn0viet: Однако размер фрагмента на главном экране изменяется и принимает тот же размер, что и дублированный (размер экрана) - нет, он должен быть настроен на то же соотношение сторон, IIRC. Вас это не беспокоит? -- не особенно. Иначе можно ли (в библиотеке) адаптировать размер зеркалирования, а не основного фрагмента? -- сейчас нет в моей библиотеке. Моя библиотека оптимизирована для максимального качества Presentation, так как во многих случаях его просматривает больше людей, чем телефон или планшет. - person CommonsWare; 13.01.2015
comment
@CommonsWare Спасибо за быстрый ответ. Я понимаю, что вы имеете в виду, есть черные полосы с обеих сторон, если мы сохраняем те же размеры, что и основной фрагмент. Если меня это так беспокоило, то это потому, что я использую ScrollView, и часть верхней части моего основного фрагмента исчезает. Так что это исходит из моего кода, и я подробно изучу, почему он это делает. Еще раз спасибо за вашу библиотеку :) - person azn0viet; 13.01.2015
comment
@CommonsWare Привет! Сейчас я нахожусь на последнем этапе (надеюсь), и я хотел бы не изменять соотношение моего исходного фрагмента и оставить черные полосы. Поэтому я думаю, что мне нужно изменить исходники, и я знаю, что ваша библиотека находится под лицензией Apache 2.0 и сделает все необходимое. Я так понял дело в классе AspectLockedFrameLayout.java и в методе onMeasure. Если LockWidth и LockedHeight не меняются, он делает то, что я хочу. Но приложение вылетает, когда я запускаю приложение, а затем подключаю внешний дисплей. Вы знаете, как я могу сделать? Большое спасибо (и он также хорошо работает с Chromecast)! - person azn0viet; 30.01.2015
comment
@azn0viet: Но приложение вылетает, когда я запускаю приложение, а затем подключаю внешний дисплей - я мало чем могу помочь с этим, не зная, что изменилось и в чем причина сбоя. Попробуйте открыть новый вопрос Stack Overflow. - person CommonsWare; 31.01.2015