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

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

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

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

Android

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

Q&A

解決済

1回答

2524閲覧

Activity画面からFragment画面への遷移をしようとするとアプリが落ちる

karin10

総合スコア34

Java

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

Android

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

0グッド

0クリップ

投稿2020/09/28 17:07

編集2020/09/30 13:28

分からないこと

MainActivity画面の下部にBottomNavigationViewを作成して、複数のFragment画面に行けるようにしたのですが、2か所でエラーが発生します。
エラーの箇所を削除してエミュレータを起動しようとすると、アプリが落ちます。

BottomNavigationViewに最初に表示される予定のFragmentはfirstFragment.javaです。
画面には一応ナビゲーションバーはきちんと表示されています。

作成したFragment.javaと、対するmy_navi.xmlのIDは
・firstFragment.java・・・・fragmentfirst3
・secondFragment.java・・・・fragmentsecond2
・thirdFragment.java・・・・fragmentthird
です。
イメージ説明

コード

activitymainxml

1 2<中略> 3 4 <com.google.android.material.bottomnavigation.BottomNavigationView 5 android:id="@+id/bottomNavigationView" 6 android:background="#fff" 7 android:layout_width="411dp" 8 android:layout_height="48dp" 9 app:layout_constraintBottom_toBottomOf="parent" 10 app:layout_constraintEnd_toEndOf="parent" 11 app:layout_constraintStart_toStartOf="parent" 12 app:menu="@menu/bottom_menu" 13 /> 14 15 <fragment 16 android:id="@+id/fragment2" 17 android:name="androidx.navigation.fragment.NavHostFragment" 18 android:layout_width="416dp" 19 android:layout_height="45dp" 20 app:defaultNavHost="true" 21 app:layout_constraintBottom_toBottomOf="parent" 22 app:layout_constraintEnd_toEndOf="parent" 23 app:layout_constraintStart_toStartOf="parent" 24 app:navGraph="@navigation/my_nav" /> 25

mainactivityjava

1import androidx.fragment.app.Fragment; 2import com.google.android.material.bottomnavigation.BottomNavigationView; 3 4public class MainActivity extends Activity { 5 6 private BottomNavigationView.OnNavigationItemSelectedListener navListener = 7 new BottomNavigationView.OnNavigationItemSelectedListener() { 8 @Override 9 public boolean onNavigationItemSelected(@NonNull MenuItem item) { 10 Fragment selectedFragment = null; 11 12 switch (item.getItemId()){ 13 case R.id.firstFragment3: 14 selectedFragment = new firstFragment();  //new firstFragmentに赤線が引かれるがmsgなし 15 break; 16 case R.id.secondFragment2: 17 selectedFragment = new secondFragment(); 18 break; 19 case R.id.thirdFragment: 20 selectedFragment = new thirdFragment(); 21 break; 22 } 23 //selectedFragmentに赤線 msgなし 24 getFragmentManager().beginTransaction().replace(R.id.fragment_container_view_tag,selectedFragment).commit();  25 26 return true; 27 } 28 }; 29 30 @Override 31 protected void onCreate(Bundle savedInstanceState) { 32 33 <中略> 34 35 BottomNavigationView bottomNav = findViewById(R.id.bottomNavigationView); 36 bottomNav.setOnNavigationItemReselectedListener((BottomNavigationView.OnNavigationItemReselectedListener) navListener); 37 getFragmentManager().beginTransaction().replace(R.id.fragment_container_view_tag,firstFragment()).commit(); 38 39 } 40 41} 42

mynavxml

1 <fragment 2 android:id="@+id/fragment1" 3 android:name="com.example.test.Fragment1" 4 android:label="fragment_1" 5 tools:layout="@layout/fragment_1" /> 6 <fragment 7 android:id="@+id/fragment2" 8 android:name="com.example.test.Fragment2" 9 android:label="fragment_2" 10 tools:layout="@layout/fragment_2" /> 11 <fragment 12 android:id="@+id/fragment3" 13 android:name="com.example.test.Fragment3" 14 android:label="fragment_3" 15 tools:layout="@layout/fragment_3" />

bottommenuxml

1 <fragment 2 android:id="@+id/fragment1" 3 android:name="com.example.test.Fragment1" 4 android:label="fragment_1" 5 tools:layout="@layout/fragment_1" /> 6 <fragment 7 android:id="@+id/fragment2" 8 android:name="com.example.test.Fragment2" 9 android:label="fragment_2" 10 tools:layout="@layout/fragment_2" /> 11 <fragment 12 android:id="@+id/fragment3" 13 android:name="com.example.test.Fragment3" 14 android:label="fragment_3" 15 tools:layout="@layout/fragment_3" />

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

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

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

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

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

pg0084

2020/09/29 05:22

BottomNavigationViewではじめに表示されるFragmentのコード見せていただくことできますか?
karin10

2020/09/29 10:40

最初に表示される予定のfirstFragment.javaとfragment_first.xmlのコードを載せさせて頂きました。 前者は何もいじっておらず、後者はTextViewを追加しただけという状況です。
keicha_hrs

2020/09/29 15:02 編集

示されたレイアウトにはNavHostFragmentが配置されていますが、Navigationを用いて遷移したいのか、FragmentManagerを用いて遷移したいのか、どっちつかずのコードになっているように思います。res/navigation/my_nav.xmlも作成したのですよね?それらを用いず、あえてFragmentManagerで遷移させたいということなのでしょうか。その辺の意図がよくわかりません。
karin10

2020/09/29 23:00

my_nav.xmlを用いて遷移させたいと考えています。 my_nav.xmlを用いた場合のMainActivity.javaの設定の仕方がよく分からず、他のサイトも参考にしていました。ごちゃ混ぜになってしまい、申し訳ありません。
guest

回答1

0

ベストアンサー

まず、build.gradle (:app)のdependenciesブロックに必要なライブラリーがimplementationされているかです。BottomNavigationViewやNavHostFragmentを配置したことでエラーになっているということは記されていないので、多分できているのだろうと思いますが、念の為差し当たって必要な下記の3つが含まれていることを確認してください。

gradle

1dependencies { 2 3 implementation 'com.google.android.material:material:1.2.1' 4 implementation "androidx.navigation:navigation-fragment:2.3.0" 5 implementation "androidx.navigation:navigation-ui:2.3.0" 6 7}

作成したFragment.javaと、対するmy_navi.xmlは
・firstFragment.java・・・・fragmentfirst3
・secondFragment.java・・・・fragmentsecond2
・thirdFragment.java・・・・fragmentthird

と記述されているのが、res/navigation/my_navi.xmlにおいてそれぞれのデスティネーションにつけられたIDを表しているものとしたら、だいたいこんな内容になっているのだろうと思います。labelの部分はこちらででっち上げているので、そちらで実際に記述している内容に読み替えてください。

xml

1<?xml version="1.0" encoding="utf-8"?> 2<navigation xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/my_nav.xml" 6 app:startDestination="@id/fragmentfirst3"> 7 <fragment 8 android:id="@+id/fragmentfirst3" 9 android:name="com.example.eiyoukun.firstFragment" 10 android:label="fragment_first" 11 tools:layout="@layout/fragment_first" /> 12 <fragment 13 android:id="@+id/fragmentsecond2" 14 android:name="com.example.eiyoukun.secondFragment" 15 android:label="fragment_second" 16 tools:layout="@layout/fragment_second" /> 17 <fragment 18 android:id="@+id/fragmentthird" 19 android:name="com.example.eiyoukun.thirdFragment" 20 android:label="fragment_third" 21 tools:layout="@layout/fragment_third" /> 22</navigation>

また、res/menu/bottom_menu.xmlもすでに作成済みと思いますが、このような感じになっているのだろうと思います。これもiconとtitleについてはでっち上げなので、そちらで作成したものに読み替えてください。ここで肝心なのは、各ItemのIDがmy_navi.xmlのデスティネーションと対応していることです。これが食い違っていたら、正しく遷移させることができません。

xml

1<?xml version="1.0" encoding="utf-8"?> 2<menu xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto"> 4 <item 5 android:id="@+id/fragmentfirst3" 6 android:enabled="true" 7 android:icon="@drawable/ic_first" 8 android:title="@string/label_first" /> 9 <item 10 android:id="@+id/fragmentsecond2" 11 android:enabled="true" 12 android:icon="@drawable/ic_second" 13 android:title="@string/label_second" /> 14 <item 15 android:id="@+id/fragmentthird" 16 android:enabled="true" 17 android:icon="@drawable/ic_third" 18 android:title="@string/label_third" /> 19</menu>

これらの準備ができたのならば、MainActivity.javaは次のように記述すれば良いでしょう。

java

1package com.example.eiyoukun; 2 3import android.os.Bundle; 4 5import androidx.appcompat.app.AppCompatActivity; 6import androidx.navigation.NavController; 7import androidx.navigation.Navigation; 8import androidx.navigation.ui.NavigationUI; 9 10import com.google.android.material.bottomnavigation.BottomNavigationView; 11 12public class MainActivity extends AppCompatActivity { 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 19 BottomNavigationView bottomNav = findViewById(R.id.bottomNavigationView); 20 NavController navController = Navigation.findNavController(this, R.id.fragment2); 21 NavigationUI.setupWithNavController(bottomNav, navController); 22 23 (以下略) 24 25 } 26}

これで、Bottom Navigationを操作すればそれに応じてフラグメントが切り替わるようになるはずです。(ただ、示されたactivity_main.xmlの内容で、NavHostFragmentが画面内に収まっているのだろうか?と疑問に思いますが)

投稿2020/09/30 08:51

keicha_hrs

総合スコア6768

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

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

karin10

2020/09/30 10:31

他のファイルについても説明していただきありがとうがとうございます!!! 一応該当するファイルを全て確認したところ、MainActivity.java以外全て問題ありませんでした。 そして、MainActivity.javaを修正して実行したところやはりアプリが落ちてしまいました。 原因の可能性としてMainActivity内には他のActivityにも遷移するコードが含まれていることを考えていますが、あまり関係ないでしょうか。
keicha_hrs

2020/09/30 11:31 編集

それは内容を見なければわかりません。原因を切り分けるために、上記のコード以外はすべてコメントアウトして動かしてみることはできませんか?または、アプリが落ちるときにはLogCatに赤字でスタックトレースが出ているはずです。それを質問に追記していただくことでもある程度原因の推測をすることはできます。
keicha_hrs

2020/09/30 11:41

firstFragmentなどがテンプレートで作成しただけのコードであることは問題にはならないはずです。私の手元でも一応実証のために同じ条件で作成して、問題なく動作していますので。
karin10

2020/09/30 12:31

LogCatに表示されたエラーメッセージを追記させて頂きましたが、どこが重要なポイントか分からずそのまま載せさせて頂きました。すごい長文となってしまっているので、もし大丈夫そうでしたらお目を通して頂けると幸いです。
karin10

2020/09/30 12:33

実証で動作の確認までしていただき本当にありがとうございます。お手を煩わせてしまい申し訳ありません。 コメントアウトしても上手くいかなかったので、新規プロジェクトを作成して試してみます。結果をみて考察した上での結果を改めて報告させていただきます。
keicha_hrs

2020/09/30 12:42 編集

スタックトレースによるとMainActivity.javaの70行目でエラーが発生しているようです。70行目というと現在質問で示されているコードの範囲外なので、現在出されている情報ではわからない問題のようです。 Trying to instantiate a class androidx.navigation.fragment.NavHostFragment that is not a Fragment という不思議なメッセージが出ているのですが、その70行目でNavHostFragmentがあるViewを用いた何らかの操作をしようとしていますか?どうもこれは主題とは別問題のようですね。もし私の回答で示した内容でフラグメントの切り替え自体は問題なくできることが確認できるのならば、一旦この質問は解決としてクローズして、その70行目の前後が分かるコードを示した新たな質問を立てるべきかもしれません。
keicha_hrs

2020/09/30 12:47

コメントが入れ違いになってしまいましたね。onCreate()を回答のような内容のみにしても落ちるのですか。でもたったあれだけの内容にしたら70行目に有効な処理など存在しませんよね。さらに違う問題を抱えているのでしょうか。もっと簡素化して、onCreate()の内容をsetContentView()までの2行だけにしてしまっても、やはりアプリは落ちますか?もしそうだとしたら、レイアウトXMLの構成に何か問題がある可能性があるように思います。
karin10

2020/09/30 13:10

確認しましたところ、70行目には setContentView(R.layout.activity_main); のみが書かれていましたので、別の問題があるようです。 新規プロジェクトで確認したところ、遷移がされませんが、無事表示されました。 おそらくコードの書き間違いが原因だと思われますので、クローズさせていただきます。 70行目に関してはしばらく粘ってみてから、改めて質問させて頂くかもしれません。 お手数をおかけして申し訳ありませんでした。 いつも本当にありがとうございます。
karin10

2020/09/30 13:42

my_nav.xmlとbottom_menu.xmlで設定するandroid:idをfragment.javaの名前のfirstFragment,secondFragment,thirdFragmentにした結果、無事遷移させることができました。 id名は遷移先のfragment.javaファイルの名前にする必要があったんですね!
keicha_hrs

2020/09/30 13:57

いや、そんなことはないですよ?実際、手元の環境はIDとファイル名は異なっていますが、特に問題はありませんし。ただ、my_nav.xmlとbottom_menu.xmlのIDの対応に誤りがあったんでしょうね。それを正した結果、動くようになったのだろうと推察します。
karin10

2020/09/30 14:06

そうなんですね。不注意ですみませんでした。 また、本来のプロジェクトでも無事に遷移させることが出来ました。public class MainActivity extends AppCompatActivity {} から public class MainActivity extends AppCompatActivity {}に変更したら上手く実装されました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問