2017-03-17 5 views
1

3つのフラグメント(HomeFragment、RegisterFragment、NewsFragment)を使用しています。戻るボタンをクリックすると、NewsFragmentからHomeFragmentに移動する方法。 Back Buttonをクリックすると、他のFragmentに移動したくありません。 NewsFragmentでフラグメントでonBackPressedを実装してHomeFragmentに到達するにはどうすればいいですか?

+0

ADDのaddbackstackto(ヌル)あなたは活動のフラグメントオブジェクトの保存フラグメント –

+1

を起動したとき(fragment.isVisibleとしてそれを使用します)。アクティビティの断片を管理します。 –

+0

詳細については、どのようにsetFragmentを呼び出してください。 –

答えて

1

私は私のフラグメントのナビゲーションを制御するユーティリティクラスを作りました。今

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; 
} 

}

、私は活動

mFragmentController = FragmentController.getInstance(this); 

でこのクラスをインスタンス化し、今、私は私のActivityからこのonBackPressed()の操作を行います。ここでは

は、このクラスがどのように見えるかです

@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); 
    } 
} 

FragmentControllerクラスでは、BaseFragmentクラスのメソッドgetTagFm()を使用しています。これは、基本的に、どのフラグメントがqueに存在し、どのフラグメントが存在しないかを認識するためのものです。これらの断片の全て(LoginFragmentOrderFragmentProgramFragment)がBaseFragmentを拡張

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; 
    } 

} 

BaseFragmentクラスは、このようなものになります。

希望すると、誰かに役立ちます。

0

@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

nullポインタの例外はありますか? –

0

あなたはこのすべての断片の交換を扱う活性を有していてもよいです。このアクティビティでは、実際に表示されているフラグメントで変数を定義すると、onBackPressedをオーバーライドし、NewsFragmentを表示しているかどうかをチェックし、HomeFragmentで置き換えることができます。

@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

これは私が戻るボタンを押すと形作られます!

あなたのfragment構造はわかりませんが、私は単一のlayoutを使用し、それぞれfragmentに置き換えています。ここで

は私のコードです:

@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

バックプレスで各フラグメントをチェックする代わりに、ビュー階層内の各フラグメントのトラックを保持する1つのスタックを維持します。

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(); 
    } 
} 
関連する問題