3つのフラグメント(HomeFragment、RegisterFragment、NewsFragment)を使用しています。戻るボタンをクリックすると、NewsFragmentからHomeFragmentに移動する方法。 Back Buttonをクリックすると、他のFragmentに移動したくありません。 NewsFragmentでフラグメントでonBackPressedを実装してHomeFragmentに到達するにはどうすればいいですか?
答えて
私は私のフラグメントのナビゲーションを制御するユーティリティクラスを作りました。今
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に存在し、どのフラグメントが存在しないかを認識するためのものです。これらの断片の全て(LoginFragment
、OrderFragment
、ProgramFragment
)が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
クラスは、このようなものになります。
希望すると、誰かに役立ちます。
:
@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);
}
nullポインタの例外はありますか? –
あなたはこのすべての断片の交換を扱う活性を有していてもよいです。このアクティビティでは、実際に表示されているフラグメントで変数を定義すると、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();
}
}
これは私が戻るボタンを押すと形作られます!
あなたの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;
}
});
}
バックプレスで各フラグメントをチェックする代わりに、ビュー階層内の各フラグメントのトラックを保持する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();
}
}
- 1. イメージノードに到達するにはどうすればいいですか
- 2. HomeFragmentを見つけるためにonBackPressedでfindFragmentByIdを実装する方法
- 3. iPhone:ホストに到達可能かどうかを確認するにはどうすればよいですか?
- 4. memshipクラスを使用して中間層に到達するにはどうすればよいですか?
- 5. w10 pcからネットワークホストでドッカーコンテナに到達するにはどうすればいいですか?
- 6. React testing:接続した(redux)コンポーネントのインスタンスに到達するにはどうすればいいですか?
- 7. Javaでzlib.compressを実装するにはどうすればいいですか
- 8. RecyclerViewでタブを実装するにはどうすればいいですか
- 9. クリックイベントでショートコードを実装するにはどうすればいいですか
- 10. webviewでフォントを実装するにはどうすればいいですか?
- 11. シンプレックスアルゴリズムをPythonで実装するにはどうすればいいですか?
- 12. アプリケーションにSAMLを実装するにはどうすればいいですか?
- 13. Docker Cloudの到達不能ノードを削除するにはどうすればいいですか?
- 14. AppCompatActivityを2つのフラグメントに実装するにはどうすればよいですか?
- 15. ImageViewのOnClickListenerをフラグメントに実装するにはどうすればよいですか?
- 16. ユーザーがここでSDKを使用してウェイポイントに到達したかどうかを検出するにはどうすればよいですか?
- 17. ビュー内のビューモデルのプロパティにはどうすれば到達できますか?
- 18. Javascriptのカラーピッカーを実装するにはどうすればいいですか?
- 19. ランキングシステムを実装するにはどうすればいいですか
- 20. タイプ関数を実装するにはどうすればいいですか?
- 21. クラスを実装するにはどうすればいいですか?Interface?
- 22. セクションリサイクラービューを実装するにはどうすればいいですか
- 23. オブジェクト内の要素に到達するにはどうすればよいですか?
- 24. スイングでフェードボタンエフェクトを実装するにはどうすればよいですか?
- 25. Xamarinでドキュメントプロバイダエクステンションを実装するにはどうすればよいですか?
- 26. Jadeでoninputを実装するにはどうすればよいですか?
- 27. Require.jsでTinyMCEを実装するにはどうすればよいですか?
- 28. iPhoneでセッションタイムアウトを実装するにはどうすればよいですか?
- 29. nativescriptでビデオコールを実装するにはどうすればよいですか?
- 30. ES6でAngularJSを実装するにはどうすればよいですか?
ADDのaddbackstackto(ヌル)あなたは活動のフラグメントオブジェクトの保存フラグメント –
を起動したとき(fragment.isVisibleとしてそれを使用します)。アクティビティの断片を管理します。 –
詳細については、どのようにsetFragmentを呼び出してください。 –