[OFFEN] Verhalten des Backbuttons bei VideoView in ListFragment

deka

deka

Dauergast
351
Hallo, ich habe in meiner App den FragmentManager um mir 6 Fragmente zu erzeugen. Jedes dieser 6 Fragmente erbt von ListFragment. In der onListItemClick prüfe ich welches Element der User anklickt und spiele das entsprechende Video ab, welches ich in der App halte.

Nun zum Problem: Wenn das Video startet und der Benutzer auf den Zurückbutton klickt, so gelangt er in die vorletzte Activity und nicht in die Activity die meine 6 Fragmente "hält". Wenn er jedoch während des Videos auf den Bildschirm tippt und die Videosteuerung erscheint (MediaController) und er dann auf den Backbutton klickt, so gelangt er wieder zurück zur Activity mit den Fragmenten. Das ist das gewünschte Verhalten. Das erzwinge ich quasi selber durch meinen Code, was ich auch nicht so schön finde.

Code:
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getActivity().setContentView(R.layout.act_video_view);

        if (position < filenames.length) {
            int rawId = getResources().getIdentifier(filenames[position], "raw", getActivity().getPackageName());
            VideoView myVideoView = (VideoView) getActivity().findViewById(R.id.myvideoview);
            myVideoView.setVideoPath("android.resource://" + getActivity().getPackageName() + "/" + rawId);
            myVideoView.setMediaController(new MediaController(getActivity()));
            myVideoView.requestFocus();
            myVideoView.start();
            myVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    getActivity().recreate();
                }
            });
            myVideoView.setMediaController(new MediaController(this.getActivity()) {
                public boolean dispatchKeyEvent(KeyEvent event) {
                    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) getActivity().recreate();

                    return super.dispatchKeyEvent(event);
                }
            });
        }
    }

Mein Ziel ist es, auch wenn die Steuerelemente des MediaController nicht angezeigt werden, dass beim Drücken des Backbuttons der Benutzer wieder zurück in die beschriebene Activity gelangt.

Hat jemand eine Idee wie das gehen soll?
 
Hallo Deka,

du kannst dein onBackPressed überschreiben und je nach Status reagieren ..
Setze ich auch des Öfteren um

Bsp

Code:
 @Override
    public void onBackPressed()
    {
        if (mMainPager.mVideoBoxIsOpen == true)
        {
            mMainPager.closeVideoBox();
        }
        else
        {
           //  bla  bla
           //  oder super.onBackPressed();
        }

Anm: Das muss aber in der Activity passieren die Deinen Pager beinhaltet - nicht in den Fragmenten
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: deka
Und wie finde ich innerhalb dieser Activity heraus, dass das Video gerade läuft?
 
Na du musst dir schon eigene Getter/Setter und Flags bauen.

Du weisst doch , wann dein Video läuft
Kannst ja dazu z.b. die diversen CallBack/Listener verwenden

P.S ich würde nicht die komplette Initalisierung in einen ClickListener einbauen .
Eher in eine eigene Klasse und Instanzen bilden
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: deka
Ich habe es mit einem boolean flag gelöst. In den Fragmenten setzte ich dieses auf true, sobald das Video läuft und in der Activity habe ich es folgendermaßen gemacht:

Code:
  @Override
    public void onBackPressed() {
        if (videoIsPlaying) {
            recreate();
            videoIsPlaying = false;
        } else {
            super.onBackPressed();
        }
    }

Ist wahrscheinlich nicht die beste Lösung, aber ich wusste jetzt nicht genau wie du das genau meinst mit den Gettern/Settern und den Listenern. Kannst du bitte mal ein Beispiel zeigen?
 
Hallo @deka,

das ist ein Design Pattern. Design Pattern sind bekannte Lösungswege für immer wiederkehrende Probleme in der Entwicklung. In dem Fall ist das Observer (Beobachter) Pattern gemeint.

Vereinfacht hört man auf Änderungen (Listener) im Code. Eine genauere Erklärung findest du hier:

Javabeginners - Observer-Pattern
Das Observer Design Pattern (Beobachter Entwurfsmuster))
Rheinwerk Computing :: Java ist auch eine Insel – 10.2 Design-Pattern (Entwurfsmuster)
Das Observer-Pattern / Beobachter-Muster

Getter/Setter braucht man unter Android nicht (Speicher und Performance). Insbesondere nicht in deinem Fall. Die werden hauptsächlich gebraucht, wenn man Klassen serialisieren muss (Java EE, Web). In der Uni wird im Java - Kurs darauf herumgeritten, meist ohne Erklärung. ;)

Zugriffsfunktion – Wikipedia
 
Moin @deka

ich hatte am WE einen ähnlichen Fall.
Den BackKey kannst du in einem Fragment folgender-massen abfangen :

Code:
  /////////////////////////////////////////////////////////////////////////////////////////
    @Override
    public void onResume()
    {
        super.onResume();

        getView().setFocusableInTouchMode(true);
        getView().requestFocus();
        getView().setOnKeyListener(new View.OnKeyListener()
        {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK)
                {
                    if (mWasAuchImmerEnabled == true)
                    {
                        //
                        return true;
                    }
                    else
                    {
                        return false;
                    }

                }
                return false;
            }
        });
    }

Es entzieht sich noch meiner Kenntnis, warum das nur bei onResume funktioniert.
Offensichtlich eine Focus Sache - Es geht aber :)
 
Zuletzt bearbeitet:

Ähnliche Themen

D
Antworten
17
Aufrufe
411
datNeMo
D
M
Antworten
3
Aufrufe
172
moin
M
Zurück
Oben Unten