初歩的な質問で申し訳ありませんが、Fragmentの遷移について困っているので助けてください。
Fragmentの遷移は、アプリ内の別のアクションではできていたので、
それと同じように作っていたつもりだったのですがなぜか失敗してしまいました。
具体的な解決法でなくてもよいのでアドバイス頂けると助かります。
やりたいこと
FragmentAでボタンをクリックしたとき、FragmentBに移動したい
発生している問題
下記のコードをFragmentAに記述したら、FragmentAが表示されるときにアプリが落ちてしまうようになった。(それまでは普通に表示できていた)
//FragmentBへ移動 fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { transaction.addToBackStack(""); transaction.replace(R.id.container, FragmentB.newInstance()); transaction.commit(); } });
該当のソースコード
・Fragment A
public class FragmentA extends Fragment { private FloatingActionButton fab; private FragmentManager manager = getFragmentManager(); private FragmentTransaction transaction = manager.beginTransaction(); public static FragmentA newInstance(){ FragmentA f = new FragmentA(); Bundle args = new Bundle(); f.setArguments(args); return f; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, container, false); fab = view.findViewById(R.id.fab); return view; } @Override public void onStart() { super.onStart(); //FragmentBへ移動 fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { transaction.addToBackStack(""); transaction.replace(R.id.container, FragmentB.newInstance()); transaction.commit(); } }); } }
・FragmentB
public class FragmentB extends Fragment { public static FragmentB newInstance() { FragmentB f = new FragmentB(); Bundle args = new Bundle(); f.setArguments(args); return f; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_b, container, false); return view; } }
試したこと
Activityに遷移の処理をするメソッドを作って、そのメソッドをFragmentAから呼び出すようにした。
結果、FragmentAは問題なく表示できるようになったが、今度はボタンをクリックした時点で落ちてしまうようになった。
//Fragmentを表示させているMainActivity FragmentManager manager = getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); public void replaceFragmentB() { FragmentB fragment = FragmentB.newInstance(); transaction.addToBackStack(""); transaction.replace(R.id.container, fragment); transaction.commit(); }
//FragmentA fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MainActivity activity = (MainActivity) getActivity(); activity.replaceFragmentB(); } });
回答1件
あなたの回答
tips
プレビュー