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]

6voto

Joaquin Iurchuk Punkte 5263

Wenn Sie den Fluss des Hinzufügens zum Back-Stack bei jeder Transaktion verwalten, dann können Sie so etwas tun, um das vorherige Fragment zu zeigen, wenn der Benutzer die Zurück-Taste drückt (Sie könnten auch die Home-Taste zuordnen).

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

6voto

Robert Punkte 1630

Oder Sie könnten verwenden getSupportFragmentManager().getBackStackEntryCount() um zu prüfen, was zu tun ist:

@Override
    public void onBackPressed() {

        logger.d("@@@@@@ back stack entry count : " + getSupportFragmentManager().getBackStackEntryCount());

        if (getSupportFragmentManager().getBackStackEntryCount() != 0) {

            // only show dialog while there's back stack entry
            dialog.show(getSupportFragmentManager(), "ConfirmDialogFragment");

        } else if (getSupportFragmentManager().getBackStackEntryCount() == 0) {

            // or just go back to main activity
            super.onBackPressed();
        }
    }

5voto

Muhammad Adil Punkte 3980

Für diejenigen, die statisches Fragment verwenden

In einem Fall, wenn Sie ein statisches Fragment haben, dann wäre es vorzuziehen. Erstellen Sie ein Instanzobjekt Ihres Fragments

private static MyFragment instance=null;

in onCreate() von MyFragment diese Instanz initialisieren

  instance=this;

auch eine Funktion zum Abrufen der Instanz erstellen

 public static MyFragment getInstance(){
   return instance;
}

machen auch Funktionen

public boolean allowBackPressed(){
    if(allowBack==true){
        return true;
    }
    return false;
}

 //allowBack is a boolean variable that will be set to true at the action 
 //where you want that your backButton should not close activity. In my case I open 
 //Navigation Drawer then I set it to true. so when I press backbutton my 
 //drawer should be get closed

public void performSomeAction(){
    //.. Your code
    ///Here I have closed my drawer
}

In Ihrer Aktivität können Sie Folgendes tun

@Override
public void onBackPressed() {

    if (MyFragment.getInstance().allowBackPressed()) { 
        MyFragment.getInstance().performSomeAction();
    }
    else{
        super.onBackPressed();
    }
}

5voto

Android Punkte 525

Arbeitscode:

package com.example.keralapolice;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentManager.OnBackStackChangedListener;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

public class ChiefFragment extends Fragment {
    View view;

    // public OnBackPressedListener onBackPressedListener;

    @Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container, Bundle args) {

        view = inflater.inflate(R.layout.activity_chief, container, false);
        getActivity().getActionBar().hide();
        view.setFocusableInTouchMode(true);
        view.requestFocus();
        view.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                Log.i(getTag(), "keyCode: " + keyCode);
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    getActivity().getActionBar().show();
                    Log.i(getTag(), "onKey Back listener is working!!!");
                    getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    // String cameback="CameBack";
                    Intent i = new Intent(getActivity(), home.class);
                    // i.putExtra("Comingback", cameback);
                    startActivity(i);
                    return true;
                } else {
                    return false;
                }
            }
        });
        return view;
    }
}

5voto

Matt Koala Punkte 2131

Am einfachsten ist es wohl, eine Schnittstelle zu erstellen und in der Aktivität zu prüfen, ob das Fragment vom Typ der Schnittstelle ist, und wenn ja, seine Methode aufzurufen, um das Pop zu behandeln. Hier ist die Schnittstelle, die im Fragment implementiert werden soll.

public interface BackPressedFragment {

    // Note for this to work, name AND tag must be set anytime the fragment is added to back stack, e.g.
    // getActivity().getSupportFragmentManager().beginTransaction()
    //                .replace(R.id.fragment_container, MyFragment.newInstance(), "MY_FRAG_TAG")
    //                .addToBackStack("MY_FRAG_TAG")
    //                .commit();
    // This is really an override. Should call popBackStack itself.
    void onPopBackStack();
}

So wird es umgesetzt.

public class MyFragment extends Fragment implements BackPressedFragment
    @Override
    public void onPopBackStack() {
        /* Your code goes here, do anything you want. */
        getActivity().getSupportFragmentManager().popBackStack();
}

Und in Ihrer Aktivität, wenn Sie das Pop behandeln (wahrscheinlich in beiden onBackPressed und onOptionsItemSelected), pop der Backstack mit dieser Methode:

public void popBackStack() {
    FragmentManager fm = getSupportFragmentManager();
    // Call current fragment's onPopBackStack if it has one.
    String fragmentTag = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName();
    Fragment currentFragment = getSupportFragmentManager().findFragmentByTag(fragmentTag);
    if (currentFragment instanceof BackPressedFragment)
        ((BackPressedFragment)currentFragment).onPopBackStack();
    else
        fm.popBackStack();
}

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