2011-10-19 21 views
7

Czy istnieje sposób ustawienia zawartości obiektu NativeActivity na komponent utworzony w Javie (na przykład FrameLayout, ImageView itp.)? Mam potrzebę użycia NativeActivity (aby uzyskać wejście touchpada w Xperia Play), ale muszę również móc przeglądać komponenty utworzone w kodzie Java.Jak ustawić widok zawartości NativeActivity na komponent utworzony w języku Java?

Próbowałem zastąpić komendę onCreate i wywołując setContentView tam, ale chociaż to nie wyrzuca żadnych błędów, to nic nie robi (prawdopodobnie dlatego, że widok treści jest już ustawiony przez natywny kod). Czy istnieje jakiś identyfikator okna lub coś, co mógłbym przekazać do natywnego kodu, aby powiedzieć, jaki powinien być widok zawartości, lub czy można to w jakiś sposób skonfigurować w XML, aby ustawić widok zawartości NativeActivity na komponent, który mogę zmodyfikować z Java?

Daj mi znać, jeśli potrzebujesz więcej informacji.

+0

Czy rozwiązałeś ten problem, próbuję zrobić coś podobnego. Dokumentacja dostarczona przez Sony jest okropna! – Kevin

Odpowiedz

12

Opublikuję odpowiedź tutaj dla innych z tym samym problemem, ponieważ w końcu wymyśliłem metodę, która działa.

W metodzie onCreate(), jeśli ustawiasz określone flagi okien (FEATURE_NO_TITLE, FLAG_FULLSCREEN, FLAG_KEEP_SCREEN_ON, itd.), Wykonaj je zanim zadzwonisz super.onCreate() (lub zostaną one zignorowane). Następnie gdziekolwiek normalnie można umieścić to:

setContentView(whatever); 

Czy to zamiast:

getWindow().takeSurface(null); 
getWindow().setContentView(whatever); 

to podstawowy sposób na treść, którą można sterować z boku Java. Każde miejsce w kodzie, w którym zajmujesz się treścią, użyj "getWindow()" zamiast "this".

Należy pamiętać, że zwykłe metody onKey i onTouch nie będą wywoływane (zamiast tego będą używane ich natywne odpowiedniki), więc jeśli musisz mieć możliwość przetwarzania danych wejściowych po stronie Java, musisz: Muszę skonfigurować połączenie JNI, aby przesłać informacje z natywnego do Java. Uważam, że wszystko inne jest zawarte w oficjalnym kodzie touchpad XPeria Play (dodatki do AndroidManifest.xml i co nie).

Jeśli chcesz spojrzeć na mojego projektu odsyłającego wynika, że ​​jest open-source i można znaleźć na stronie:

http://www.paulscode.com/forum/index.php?topic=75.msg1540#msg1540

Wystarczy kliknąć link „kod źródłowy” obok „XPERIA PLAY Touch- Przykład pada ". Być może nie jest to dla ciebie przydatne, ponieważ jest to raczej duży projekt i może być trudno znaleźć to, czego szukasz. Jeśli masz jakieś problemy, opublikuj pytanie na moim forum lub napisz do mnie, a ja z chęcią Ci pomogę.

+2

Interesujące podejście. Udało mi się użyć własnego układu w NativeActivity. Nadal muszę wyświetlać to, co jest renderowane przez bibliotekę C++, której używam (w tym przypadku Cocos2d-x 3.x). Czy istnieje sposób na osadzenie SurfaceView lub podobnego i powiązanie go z kodem C++? – Soflete

+0

@ Wysyłany przez ciebie link jest 404 lub zabronione –

+0

@AmitHooda link jest w porządku, ale twoje IP może być zablokowane (mój host ma surowe środki antyspamowe) – paulscode