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]

4voto

Amio.io Punkte 19007

Dies ist eine sehr gute und zuverlässige Lösung: http://vinsol.com/blog/2014/10/01/handling-back-button-press-inside-fragments/

Der Typ hat ein abstraktes Fragment erstellt, das das BackPress-Verhalten handhabt und zwischen den aktiven Fragmenten unter Verwendung des Strategiemusters wechselt.

Für einige von Ihnen gibt es vielleicht einen kleinen Nachteil in der abstrakten Klasse...

Kurz gesagt, die Lösung aus dem Link lautet wie folgt:

// Abstract Fragment handling the back presses

public abstract class BackHandledFragment extends Fragment {
    protected BackHandlerInterface backHandlerInterface;
    public abstract String getTagText();
    public abstract boolean onBackPressed();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(!(getActivity()  instanceof BackHandlerInterface)) {
            throw new ClassCastException("Hosting activity must implement BackHandlerInterface");
        } else {
            backHandlerInterface = (BackHandlerInterface) getActivity();
        }
    }

    @Override
    public void onStart() {
        super.onStart();

        // Mark this fragment as the selected Fragment.
        backHandlerInterface.setSelectedFragment(this);
    }

    public interface BackHandlerInterface {
        public void setSelectedFragment(BackHandledFragment backHandledFragment);
    }
}   

Und die Nutzung in der Aktivität:

// BASIC ACTIVITY CODE THAT LETS ITS FRAGMENT UTILIZE onBackPress EVENTS 
// IN AN ADAPTIVE AND ORGANIZED PATTERN USING BackHandledFragment

public class TheActivity extends FragmentActivity implements BackHandlerInterface {
    private BackHandledFragment selectedFragment;

    @Override
    public void onBackPressed() {
        if(selectedFragment == null || !selectedFragment.onBackPressed()) {
            // Selected fragment did not consume the back press event.
            super.onBackPressed();
        }
    }

    @Override
    public void setSelectedFragment(BackHandledFragment selectedFragment) {
        this.selectedFragment = selectedFragment;
    }
}

4voto

Ashish Soni Punkte 266
            rootView.setFocusableInTouchMode(true);
            rootView.requestFocus();
            rootView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)   {
            if (keyCode == KeyEvent.KEYCODE_BACK) {

                Fragment NameofFragment = new NameofFragment;

                FragmentTransaction  transaction=getFragmentManager().beginTransaction();
                transaction.replace(R.id.frame_container,NameofFragment);

                transaction.commit();

                return true;
            }
            return false;
        }
    });

    return rootView;

4voto

RRTW Punkte 3112

Ich arbeite mit SlidingMenu und Fragment, präsentieren meinen Fall hier und hoffen, hilft jemand.

Logik beim Drücken der Taste [Zurück]:

  1. Wenn SlidingMenu angezeigt wird, schließen Sie es, dann gibt es nichts mehr zu tun.
  2. Oder wenn das 2. (oder weitere) Fragment angezeigt wird, gleiten Sie zum vorherigen Fragment zurück, und es gibt nichts mehr zu tun.
  3. SlidingMenu wird nicht angezeigt, aktuelles Fragment ist #0, tut die ursprüngliche [Back]-Taste.

    public class Main extends SherlockFragmentActivity
    {
      private SlidingMenu menu=null;
      Constants.VP=new ViewPager(this);
    
      //Some stuff...
    
      @Override
      public void onBackPressed()
      {
        if(menu.isMenuShowing())
        {
          menu.showContent(true); //Close SlidingMenu when menu showing
          return;
        }
        else
        {
          int page=Constants.VP.getCurrentItem();
          if(page>0)
          {
            Constants.VP.setCurrentItem(page-1, true); //Show previous fragment until Fragment#0
            return;
          }
          else
          {super.onBackPressed();} //If SlidingMenu is not showing and current Fragment is #0, do the original [Back] key does. In my case is exit from APP
        }
      }
    }

2voto

hash Punkte 5146

Wenn Sie FragmentActivity. verwenden, gehen Sie wie folgt vor

rufen Sie zunächst This innerhalb Ihres Fragments auf.

public void callParentMethod(){
    getActivity().onBackPressed();
}

und dann Aufruf onBackPressed Methode auf der Seite Ihrer Eltern FragmentActivity Klasse.

@Override
public void onBackPressed() {
  //super.onBackPressed();
  //create a dialog to ask yes no question whether or not the user wants to exit
  ...
}

2voto

Sie können von getActionBar().setDisplayHomeAsUpEnabled() :

@Override
public void onBackStackChanged() {
    int backStackEntryCount = getFragmentManager().getBackStackEntryCount();

    if(backStackEntryCount > 0){
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }else{
        getActionBar().setDisplayHomeAsUpEnabled(false);
    }
}

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