2016-08-09 15 views
0

Ich habe eine App, wo ich verschiedene Player zum Abspielen verschiedener Arten von Streams, z. Ich verwende MediaPlayer und YoutubePlayerSupportFragment über die YouTube-Player-API. Daher habe ich einen separaten Controller für Play/Pause/etc erstellt, auch ein Benutzer kann auf eine Float-Schaltfläche klicken (wodurch der Player verkleinert und gezogen wird). Dazu benutze ich einen Dialog (YouTube-Player-API erlaubt keine Ansichten auf dem Player).Android - Ereignisse Übergabe von Dialog zu MainActivity

Also das Problem, das ich gegenüberstelle, ist dies: während die Dialog ist aktiv (zeigt) keine Touch-Ereignisse durch die MainActivity gehen. Ich habe dieses Problem überwunden, indem ich MotionEvent s über dispatchTouchEvent() von besagtem Activity von DialogdispatchTouchEvent() sendete. Es funktioniert gut, wie ich es will, und ich kann jetzt zwischen verschiedenen Bereichen der App wechseln, aber ich kann keine Klicken Sie auf Ereignisse auf ListView und GridView nur alles andere funktioniert gut.

Ich überprüfte die ListView 's dispatchTouchEvent() und ich bekomme alle MotionEvent s.

Hier ist der Code, den ich verwende, um Ereignisse an die MainActivity zu senden.

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 

    if (isPlayerMinimized) { 
     if (playerDraggableView != null) { 
      playerDraggableView.dispatchTouchEvent(event); 
     } 

     return ((MainActivity) mContext).dispatchTouchEvent(event); 
    } 
    else if (!onControlViews(event)) { 
     detector.onTouchEvent(event); 
    } 

    return super.dispatchTouchEvent(event); 
} 

kann ich die ListView blättern und GridView aber nicht OnItemClickListener oder OnItemLongClickListener Events abzufeuern.

Meine Frage ist, ist dies das richtige/beabsichtigte Verhalten? Wenn ja, gibt es eine Möglichkeit, MotionEvent s an die MainActivity zu senden. Oder fehlt mir etwas? Wenn das der Fall ist, dann weisen Sie bitte darauf hin.

Ich weiß, dass es hier nicht genug Code gibt, um eine Lösung zu liefern, aber wenn ich hier etwas offensichtliches verpasse, dann sag es bitte. Vielen Dank!

Antwort

0

Es ist nicht verwunderlich, dass das Senden von MotionEvent s an die MainActivity von einem Dialog nicht unterstützt wird, das ist definitiv nicht die beabsichtigte Verwendung von Dialog s.

Es ist möglich, mehrere Fragment s in einer einzigen Aktivität gleichzeitig zu aktivieren, . Es gibt also keinen Grund, warum Sie kein komplett separates Fragment über das YouTubePlayerSupportFragment als Transportsteuerelemente oder was auch immer Sie benötigen. Der Trick besteht darin, jede Fragment in einem Container ViewGroup, wie zum Beispiel FrameLayout, zu platzieren und sie so zu verwalten.

Sie können kein weiteres Fragment hinzufügen, das überlappt, siehe unten.

z.

SomeFragment fragment = SomeFragment.newInstance(); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.replace(containerId, fragment, "useful_tag_for_fragment"); 
fragmentTransaction.commitAllowingStateLoss(); 

Offensichtlich stellen Sie sicher, Ihren Transport (Play, Pause, Stopp Kontrollen) Fragment über den YouTubePlayerSupportFragment in Zeichenreihenfolge oder es wird verschlossen werden.

Für das separate Problem der Kommunikation zwischen Fragment s und Activity Objekte können Sie Otto verwenden, die meine persönliche Lieblings-Event-Bus ist.

EDIT

Obwohl es in der Regel möglich ist Fragment s zu überlagern, verbietet YouTubePlayer dies ausdrücklich und wirft einen YouTubePlayer.ErrorReason.UNAUTHORIZED_OVERLAY Fehler.

Es scheint jedoch möglich, ein Overlay über YouTubePlayerView hinzuzufügen, wenn es direkt in einem Layout-XML verwendet wird. Das Problem hierbei ist, dass Sie eine Aktivität verwenden müssen werden die YouTubeBaseActivity erstreckt, die keine Flexibilität Sie suchen, insbesondere für Schrumpf- und Drag-and-Swapping MediaPlayer gewickelt Fragment s usw.

Von dem, was nicht unterstützt Ich kann sehen, dass es keinen Weg gibt, es gibt viele andere Leute, die nach diesem Thema fragen und nichts kommt auf. Am Ende des Tages ist dieser Code Closed Source und YouTube möchte offensichtlich ihr Branding schützen.

+0

Vielen Dank für die Antwort, aber wie ich schon sagte YouTube Player erlaubt keine Ansichten auf sich selbst zu sein. Außer natürlich 'Dialog's und' DialogFragment's. Der Player wird mit einem Overlay-Fehler beendet. Siehe [link] (https://developers.google.com/youtube/android/player/reference/com/google/android/youtube/player/YouTubePlayer.ErrorReason). – Abbas

+0

Ich sehe, ich habe das vorher nicht gesehen. Haben Sie versucht, ein 'YouTubePlayerView' direkt in Ihr Layout-XML einzufügen? Ich kann Overlays hinzufügen, obwohl ich 'YouTubePlayerSupportFragment' nicht verwende, meine' Activity' erweitert 'YouTubeBaseActivity' anstelle von –

+0

Ich habe' YouTubePlayerView' nicht verwendet und möchte es lieber nicht. 'YoutubePlayerSupportFragment' ist ein Fragment, das die Flexibilität bietet, einfach zwischen verschiedenen Spielern zu wechseln und einen ziemlich nützlichen Backstack zu bieten. Ich würde also lieber 'YouTubePlayerSupportFragment' verwenden, aber wenn es keinen anderen Ausweg aus dieser Unordnung gibt, könnte ich mir überlegen, einen' YoutubePlayerView' in ein Fragment einzufügen und zu sehen, ob das funktioniert. Aber jetzt habe ich 4 verschiedene Spieler in meiner App und ich kann nicht einfach das gesamte Design ändern. – Abbas

Verwandte Themen