372 Stimmen

Android Fragment Griff zurück Taste drücken

Ich habe einige Fragmente in meiner Aktivität

[1], [2], [3], [4], [5], [6]

Und wenn ich die Zurück-Taste drücke, muss ich von [2] zu [1] zurückkehren, wenn das aktuelle aktive Fragment [2] ist, oder sonst nichts tun.

Wie kann man das am besten bewerkstelligen?

EDIT : Die Anwendung darf von [3] nicht zu [2] zurückkehren...[6]

437voto

Mark Allison Punkte 21800

Wenn Sie zwischen Fragmenten wechseln, rufen Sie addToBackStack() als Teil Ihrer FragmentTransaction :

FragmentTransaction tx = fragmentManager.beginTransation();
tx.replace( R.id.fragment, new MyFragment() ).addToBackStack( "tag" ).commit();

Wenn Sie eine detailliertere Kontrolle benötigen (z.B. wenn einige Fragmente sichtbar sind und Sie die Zurück-Taste unterdrücken wollen), können Sie eine OnKeyListener in der übergeordneten Ansicht Ihres Fragments:

//You need to add the following line for this solution to work; thanks skayred
fragment.getView().setFocusableInTouchMode(true);
fragment.getView().requestFocus();
fragment.getView().setOnKeyListener( new OnKeyListener()
{
    @Override
    public boolean onKey( View v, int keyCode, KeyEvent event )
    {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            return true;
        }
        return false;
    }
} );

275voto

Pedro Andrade Punkte 4337

Ich würde lieber etwas in dieser Art machen:

private final static String TAG_FRAGMENT = "TAG_FRAGMENT";

private void showFragment() {
    final Myfragment fragment = new MyFragment();
    final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment, fragment, TAG_FRAGMENT);
    transaction.addToBackStack(null);
    transaction.commit();
}

@Override
public void onBackPressed() {
    final Myfragment fragment = (Myfragment) getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);

    if (fragment.allowBackPressed()) { // and then you define a method allowBackPressed with the logic to allow back pressed or not
        super.onBackPressed();
    }
}

133voto

ANemati Punkte 4696

Wenn Sie die onKey-Methode für die Fragmentansicht überschreiben, benötigen Sie :

    view.setFocusableInTouchMode(true);
    view.requestFocus();
    view.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                Log.i(tag, "keyCode: " + keyCode);
                if( keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                    Log.i(tag, "onKey Back listener is working!!!");
                    getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    return true;
                } 
                return false;
            }
        });

97voto

shimatai Punkte 1649

使用する addToBackStack Methode, wenn ein Fragment durch ein anderes ersetzt wird:

getFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).addToBackStack("my_fragment").commit();

Verwenden Sie dann in Ihrer Aktivität den folgenden Code, um von einem Fragment zu einem anderen (dem vorherigen) zurückzugehen.

@Override
public void onBackPressed() {
    if (getParentFragmentManager().getBackStackEntryCount() > 0) {
        getParentFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

58voto

Tejas Mehta Punkte 1619

Wenn Sie Hardware-Back-Key-Ereignis behandeln wollen, dann müssen Sie folgenden Code in Ihrer onActivityCreated()-Methode von Fragment tun.

Sie müssen auch das Ereignis Action_Down oder Action_UP überprüfen. Wenn Sie dies nicht tun, wird die Methode onKey() 2 Mal aufgerufen.

Auch, wenn Ihr rootview (getView()) wird nicht enthalten Fokus dann wird es nicht funktionieren. Wenn Sie auf ein beliebiges Steuerelement geklickt haben, müssen Sie dem Rootview mit getView().requestFocus() den Fokus geben; danach wird nur noch onKeydown() aufgerufen.

getView().setFocusableInTouchMode(true);
getView().requestFocus();

getView().setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    if (keyCode == KeyEvent.KEYCODE_BACK) {
                        Toast.makeText(getActivity(), "Back Pressed", Toast.LENGTH_SHORT).show();
                    return true;
                    }
                }
                return false;
            }
        });

Für mich funktioniert das sehr gut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X