14

Próbowałem rozwiązać ten problem, przeszukany przez Internet, nie znaleziono żadnej prawdziwej odpowiedzi.YouTubePlayerSupportFragment w pojedynczej aplikacji Aktywności ze zmianą orientacji

Pracuję nad aplikacją, w której potrzebny jest odtwarzacz YouTube. Ten odtwarzacz jest YouTubePlayerSupportFragment, ponieważ znajduje się w fragmencie wsparcia (więc jest również zagnieżdżony). Po wstępnej konfiguracji zdałem sobie sprawę, że za każdym razem, gdy obracam telefon, wideo przestaje grać i musi zostać ponownie uruchomione. To oczywiście nie jest to, czego chcę.

Następnie znalazłem kilka odpowiedzi SO (like this), gdzie ludzie mówią, że działanie musi obsłużyć zmiany w konfiguracji, więc dodałem android:configChanges="keyboardHidden|orientation|screenSize" do działania w manifeście. To rozwiązało problem, wideo odtwarza się nawet po zmianie orientacji, a obrót na pełnym ekranie nie wygląda źle. Fajnie, powiedziałem, tylko po to, by zdać sobie sprawę z tego, że to spartaczyło się z innymi częściami aplikacji, ponieważ konfiguracja jest teraz aktualizowana po wszystkie widoki są na miejscu. Oznacza to, że jeśli mój telefon był w trybie portretowym, a następnie obróciłem go w orientację poziomą, używany układ nadal miał być portretem.

znalazłem rozwiązania tego sugeruje powołanie setContentView(...) w działalności na onConfigurationChanged(...) i reinflating pogląd we fragmentach, ale to wydaje się być dość uciążliwe, jeśli nie straszne rozwiązanie, ponieważ nie tylko proste ustawienie treści muszę fragmenty potrzebne do zatrzymania (np. pozycja przewijania w RecyclerView). Wbudowany setRetainInstance(true) nie działa w tym przypadku, ponieważ widok byłby odtworzony także z tym, ale konfiguracja jest wciąż stara, gdy wywoływana jest onCreateView(...).

Byłoby miło, gdybym mógł złapać zdarzenia configChanges, jeśli użytkownik jest tylko na tym ekranie (fragment), ale zachowuje aktywność rekreacyjną w innym miejscu.

Nie sugeruj używania więcej działań, I nie może używać oddzielnej aktywności dla tego ekranu i reszty aplikacji ze względu na UI/UX.

+0

Jeśli problem dotyczy fragmentu odtwarzacza, należy go nadmuchać w oddzielnej czynności i dodać właściwości do tego działania. Pozostałe konfiguracje nie będą miały wpływu. –

+0

Tak jak powiedziałem w ostatnim zdaniu: używanie innego działania jest ** nie jest opcją **. –

+0

Czy próbowałeś używać stanów onSaveInstanceState i onRestoreInstance, które zawsze były używane, gdy chcesz zachować pewien stan poprzez zmiany orientacji? Nie wiem, jaka jest struktura kodu, ale na przykład w onSaveInstanceState można zachować identyfikator wideo, który jest odtwarzany teraz i w czasie. I w onRestoreInstanceState przejąć te dane i przekazać je do fragmentu lub Youtube Player lub cokolwiek innego. W tym przypadku nie ma potrzeby w "android: configChanges =" keyboardHidden | orientation | screenSize "' –

Odpowiedz

3

Zgodnie this YouTube Android API odtwarzacza wytycznych

To jest zachęcany, aby obsłużyć zmiany konfiguracji spowodowanych orientacji w swojej działalności ręcznie, aby uniknąć odtworzenia zobaczyć tę fragment za każdym razem zmiany w konfiguracji. Dla najlepszego doświadczenia użytkownika, należy również ręcznie obsługiwać pełnoekranowy zdarzenie zmieniając układ swojej działalności. (Patrz drugi approch)

Jak jesteś już postępowania w sprawie zmian konfiguracji na własną rękę, mogę zobacz dwa możliwe rozwiązania twojego problemu.

  1. Set setFullscreenControlFlags (do obiektu YouTubePlayer) do FULLSCREEN_FLAG_ALWAYS_FULLSCREEN_IN_LANDSCAPE (To sprawia, że ​​odtwarzacz automatycznie przechodzi w tryb pełnoekranowy, gdy urządzenie przechodzi orientacji poziomej.) W połączeniu z FULLSCREEN_FLAG_CONTROL_ORIENTATION (Aby włączyć automatyczną kontrolę orientacji.) Flagi.

Zauważ, że ta flaga powinna być ustawiona tylko wtedy, gdy działalność ta jest zablokowana w portret (i jest określone jako takie w manifeście).

Ta flaga przydaje się, jeśli nie masz układu krajobrazu dla swojej aktywności , ale chcesz włączyć orientację poziomą wyłącznie dla oglądania wideo na pełnym ekranie .

  1. Takie podejście może rozwiązać swój problem i to jest również sugerowane przez oficjalnej dokumentacji jak wspomniałem powyżej. W zestawie metod , który wyłącza domyślny układ obsługi pełnego ekranu, umożliwiając ręczne sterowanie przejściem do układu pełnego ekranu. Oprócz tego, że można zaimplementować niestandardowy układ pełnoekranowy, ta opcja zapewnia także uniknięcie ponownego buforowania, które występuje w domyślnym zachowaniu pełnoekranowym.

Aplikacja realizacji niestandardowych pełnoekranowy zachowanie powinno zapewnić dwie rzeczy

Pogląd gracz zajmuje całą dostępną przestrzeń okna aplikacji ilekroć onFullscreen (logiczna) jest tzw. To działanie nie zostanie odtworzone, gdy orientacja zmieni się na krajobraz. Aby to osiągnąć w przypadku działania obsługującego portret, musisz podać, że twoja aktywność obsługuje samodzielnie zmiany konfiguracji w manifeście aplikacji, w tym orientację, keyboardHidden i screenSize.

Zobacz here na temat korzystania z tej flagi.

Zgodnie z pierwszą wspólną opcją link unikniemy ponownego tworzenia widoku fragmentu za każdym razem, gdy zmieni się konfiguracja. Nie musisz też dzwonić pod numer setContentView(...) w onConfigurationChanged(...).

Mam nadzieję, że to ci pomoże.

+0

Dzięki, ale prawdopodobnie źle zrozumiałeś problem. Obecnie nie zajmuję się zmianami konfiguracyjnymi, ponieważ wydaje się to bardzo trudne (tak jakbym ciągle uzyskiwał wyjątki wszędzie, gdy spróbuję ponownie wywołać 'setContentView (...)').Jeśli ustawię flagi w atrybucie 'configChanges' w manifeście, odtwarzacz działa również w trybie pełnoekranowym i" okienkowym ", ale widoki nie otrzymują uaktualnionej konfiguracji, więc jeśli mam dwa układy dla portretu i krajobrazu oddzielnie, portret będzie nadal używany w krajobrazie, ponieważ 'onCreate (...)' dzieje się ze starą konfiguracją. –

+0

@gergely możesz wkleić kod, jeśli to możliwe. Rozumiem, że twoja metoda onConfigurationChanged (...) nie zadzwoniła, chociaż określasz atrybut configChanges w manifeście z wartością keyboardHidden | orientation | screenSize, W przypadku orientacji zmień wywołania metody onCreate (...). Twoje oczekiwane zachowanie jest naConfigurationChanged (...) Metoda zostanie wywołana, gdy zmiana orientacji zamiast onCreate (..). Popraw mnie, jeśli się mylę. –

+0

Nie, jeśli podam atrybut 'configChanges', film w YouTube będzie działał poprawnie, nawet jeśli zmieni się orientacja, ale reszta aplikacji zostanie pomieszana, ponieważ nie załaduje ważnych zasobów (tak jak powiedziałem, to ładuje się układ portretu w trybie poziomym). Jeśli nie określę 'configChanges', to reszta aplikacji będzie działać (oczywiście), ale film na YouTube zostanie wkręcony, ponieważ zatrzymuje się i ponownie ładuje po zmianie orientacji. Chcę, aby reszta aplikacji działała dobrze, podczas gdy fragment YouTube nadal odtwarza wideo o zmianie orientacji. –