質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

782閲覧

Fragmentの遷移ができません。

kashikoma

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/12/06 09:49

初歩的な質問で申し訳ありませんが、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(); } });

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/12/06 13:31

どういうエラーが出ますか?
kashikoma

2019/12/06 13:35

ビルドでは何もエラーは出ず、実機でアプリを開いてからFragmentAを開くと落ちてしまいます。 ログのとり方がよく分からないのですが、ログを取った方がいいんでしょうか?
退会済みユーザー

退会済みユーザー

2019/12/06 14:05

まあ、Android Studioで見れますしねえ… 取ったほうがいい、と言われれば、それを当たり前にして頂かないと。
kashikoma

2019/12/06 14:09

エラーが出なかったらなんとも言えないという感じでしょうか?
jimbe

2019/12/06 14:18

何が起きているのか分からないのでは, デバッグも進まないと思います. android studio から実機で実行させ, logcat 画面でログを見れないのでしょうか.
guest

回答1

0

ベストアンサー

private FragmentManager manager = getFragmentManager();
private FragmentTransaction transaction = manager.beginTransaction();

この辺りは問題ありそうに思います.
これを消して

FragmentB fragment = FragmentB.newInstance(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); //追加 transaction.addToBackStack("");

とされては如何でしょうか.

投稿2019/12/06 14:53

編集2019/12/06 14:54
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kashikoma

2019/12/09 07:25

返信が遅れてしまい申し訳ありませんでした。 教えて頂いたようにしてみたらちゃんと遷移できるようになりました。 privateつけてたのが良くなかったのでしょうか・・ あとgetFragmentManager().beginTransaction();が1行で書けるの知らなかったのでありがたいです。 ご回答いただきありがとうございました。
jimbe

2019/12/09 11:11

> privateつけてたのが良くなかったのでしょうか private ではなく, クラスのフィールドにしていたのが問題です. getFragmentManager() のドキュメントに書いてあったように思いますが, このメソッドはフラグメントがアクティビティに設定されるまでは null を返します. フィールドはインスタンスの生成時に初期化されますから, その時点ではこのメソッドは null を返すことになります. また, beginTransaction() は「あらかじめやっておく」ようなものではありません. フラグメントを操作する都度, beginTransaction ~ commt をセットで行うようにしてください. > getFragmentManager().beginTransaction();が1行で書けるの知らなかった getFragmentManager() が有効なオブジェクトを返せば, そのメソッドが使用できるのが普通です. この場合は FragmentManager オブジェクト自体は不要ですのでこのように出来ます. また, もし有効なオブジェクトを返されない場合があればここで例外が発生しバグとなりますので, 一度変数に入れてチェックする必要があります.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問