2017-03-17 2 views
1

Ich benutze 3 Fragment (HomeFragment, RegisterFragment und NewsFragment) .Wie von NewsFragment zu Direct HomeFragment zu bewegen, wenn ich auf Zurück klicken. Ich möchte nicht zu einem anderen Fragment wechseln, wenn ich auf "Zurück" klicke.Wie man onBackPressed in Fragment implementiert und HomeFragment erreicht?

+0

ADD addbackstackto (null), wenn Sie Fragment –

+1

speichern Fragment-Objekt in der Aktivität verwenden Sie es als fragment.isVisible() beginnen; und verwalten Fragment in Aktivität. –

+0

bitte, wie SieFragment Anruf für weitere Details setzen. –

Antwort

1

ich eine Utility-Klasse gemacht, die mein Fragment Navigation steuern. Hier

ist, was diese Klasse wie folgt aussieht:

public class FragmentController { 

    private static final String TAG = FragmentController.class.getCanonicalName(); 
    private static FragmentController mInstance; 
    private ArrayList<BaseFragment> mFragmentsList; 
    private BaseActivity mActivity; 
    private FrameLayout mFragmentContainer; 

    public FragmentController(BaseActivity activity) { 
     set(activity); 
    } 

    public static FragmentController getInstance(BaseActivity activity) { 
     if (mInstance == null) 
      mInstance = new FragmentController(activity); 
     return mInstance; 
    } 

    public static void setInstance(FragmentController mInstance) { 
     FragmentController.mInstance = mInstance; 
    } 

    public void set(BaseActivity activity) { 
     mActivity = activity; 
     if (mActivity instanceof MainActivity) { 
      mFragmentContainer = ((MainActivity) mActivity).getFragmentContainer(); 
     } 
     mFragmentsList = new ArrayList<>(); 
    } 

    public void addFirstFragment(BaseFragment fragment) { 
     mFragmentsList.add(fragment); 
    } 

    public void presentFragment(BaseFragment fragment, boolean removeAllFromBackstack) { 
     try { 
      Log.d(TAG, "presentFragment: " + fragment.getTagFm()); 
      if (mActivity.getCurrentFocus() != null) { 
       ViewUtils.hideKeyboard(mActivity.getCurrentFocus()); 
      } 
      FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 
      ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); 
      ft.replace(mFragmentContainer.getId(), fragment, fragment.getTagFm()); 
      ft.addToBackStack(fragment.getTagFm()); 
      ft.commitAllowingStateLoss(); 
      if (mFragmentsList.size() != 0) 
       if (removeAllFromBackstack) { 
        if (mFragmentsList.size() == 2) { 
         mFragmentsList.remove(1); 
        } else if (mFragmentsList.size() > 2) { 
         mFragmentsList.subList(1, mFragmentsList.size()).clear(); 
        } 
       } 
      if (!isFragmentPresent(fragment)) 
       mFragmentsList.add(fragment); 
     } catch (Exception e) { 
      e.printStackTrace(); 


} 
} 

public void removeSecondFragment() { 
    mFragmentsList.remove(1); 
} 

private boolean isFragmentPresent(BaseFragment fragment) { 
    for (BaseFragment baseFragment : mFragmentsList) { 
     if (baseFragment.getTagFm().equals(fragment.getTagFm())) 
      return true; 
    } 
    return false; 
} 

public BaseFragment getCurrentFragment() { 
    return mFragmentsList.get(mFragmentsList.size() - 1); 
} 

public ArrayList<BaseFragment> getFragmentsList() { 
    return mFragmentsList; 
} 

}

Nun, ich instanziiert diese Klasse in einer Aktivität

mFragmentController = FragmentController.getInstance(this); 

und jetzt mache ich das onBackPressed() von meinem Activity

@Override 
public void onBackPressed() { 
    if (mFragmentController.getFragmentsList().size() == 1) { 
     finish(); 
    } 
    else { 
     mFragmentController.getFragmentsList().remove(mFragmentController.getFragmentsList().size() - 1); 
     mFragmentController.presentFragment(mFragmentController.getFragmentsList().get(mFragmentController.getFragmentsList().size() - 1), false); 
    } 
} 

In FragmentController Klasse, werden Sie sehen, dass ich mit der Methode getTagFm() auf BaseFragment Klasse. Dies dient im Wesentlichen dazu, zu erkennen, welches Fragment in que vorhanden ist und welches nicht. BaseFragment Klasse wird so etwas wie dieses:

public class BaseFragment extends Fragment { 

public String getTagFm() { 
     if (this.getClass().getSimpleName().equals(LoginFragment.class.getSimpleName())) { 
      return Constants.TAG_FRAGMENT_LOGIN; 
     } else if (this.getClass().getSimpleName().equals(OrderFragment.class.getSimpleName())) { 
      return Constants.TAG_FRAGMENT_ORDER; 
     } else if (this.getClass().getSimpleName().equals(ProgramFragment.class.getSimpleName())) { 
      return Constants.TAG_FRAGMENT_PROGRAM; 
     } 
     return Constants.TAG_FRAGMENT_ORDER; 
    } 

} 

wo alle diese Fragmente (LoginFragment, OrderFragment, ProgramFragment) BaseFragment verlängern.

Hoffe, das hilft jemandem.

0

In NewsFragment:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (Integer.parseInt(android.os.Build.VERSION.SDK) > 5 
      && keyCode == KeyEvent.KEYCODE_BACK 
      && event.getRepeatCount() == 0) { 
     onBackPressed(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 


@Override 
public void onBackPressed() { 
    HomeFragment f = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_home); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.show(f); 
} 
+0

Wird es null Zeiger Ausnahme geben? –

0

Sie können eine Aktivität haben diese alle Fragmente Ersatz Handhabung. Wenn Sie in dieser Aktivität eine Variable mit dem eigentlichen Ergebnisfragment definieren, können Sie onBackPressed überschreiben und prüfen, ob NewsFragment angezeigt wird und diese durch HomeFragment ersetzt wird.

@Override 
public void onBackPressed() { 
    if(actualFragment instanceof NewsFragment) { 
     HomeFragment homeFragment = new HomeFragment(); 
     FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
     transaction.replace(R.id.fragment_container, homeFragment); 
     transaction.commit(); 
    } 
} 
0

Dies funktioniert mir, wenn ich den Zurück-Knopf drücke!

Ich weiß nicht, Ihre fragment Struktur, aber ich verwende eine einzige layout und ersetzen Sie sie durch die entsprechende fragment.

Hier ist mein Code:

@Override 
    //Pressed return button - returns to the results menu 
    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){ 
        frag_name frag_name = new frag_name(); 
        FragmentManager manager = getActivity().getSupportFragmentManager(); 
        manager.beginTransaction().replace(R.id.yourlayout, frag_name, frag_name.getTag()).commit(); 
        return true; 
       } 
       return false; 
      } 
     }); 
    } 
0

Anstatt jedes Fragment beim Zurückdrücken zu prüfen, wird ein Stapel verwaltet, der die Verfolgung jedes Fragments in der Ansichtshierarchie behält.

Stack<Fragment> fragmentStack= new Stack<Fragment>(); 
    // add first fragment 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction ft = fragmentManager.beginTransaction(); 
    ft.add(R.id.container, "your fragment object"); 
    //push it in stack 
    fragmentStack.push(homeListFragment); 
    ft.commit(); 

// add second fragment 
ResultListFragment resultListFragment = new ResultListFragment(); 
    ft.add(R.id.container, resultListFragment); 
    fragmentStack.lastElement().onPause(); 
    ft.hide(fragmentStack.lastElement()); 
    fragmentStack.push(resultListFragment); 
    ft.commit(); 

//now back button press logic 
@Override 
public void onBackPressed() { 

    if (fragmentStack.size() == 2) { 
     FragmentTransaction ft = fragmentManager.beginTransaction(); 
     fragmentStack.lastElement().onPause(); 
     ft.remove(fragmentStack.pop()); 
     fragmentStack.lastElement().onResume(); 
     ft.show(fragmentStack.lastElement()); 
     ft.commit(); 
    } else { 
     super.onBackPressed(); 
    } 
} 
Verwandte Themen