AndroidStudio2.3 の「Bottom Navigation Activity」を利用して、fragmentの画面遷移を行いたいのですが、最初の画面(Main)が表示されるのはいいのですが、下部メニュー部をタッチすると、
「問題が発生したため、「アプリ名」を終了します。」
というエラーが出てしまいます。
###追記:Logcat(赤字部抜粋)です
logcat
103-04 00:47:01.287 7080-7080/sfw.tabtest E/AndroidRuntime: FATAL EXCEPTION: main 2 Process: sfw.tabtest, PID: 7080 3 java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()' on a null object reference 4 at sfw.tabtest.MainActivity$1.onNavigationItemSelected(MainActivity.java:33) 5 at android.support.design.widget.BottomNavigationView$1.onMenuItemSelected(BottomNavigationView.java:141) 6 at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:817) 7 at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156) 8 at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:964) 9 at android.support.design.internal.BottomNavigationMenuView$1.onClick(BottomNavigationMenuView.java:89) 10 at android.view.View.performClick(View.java:4756) 11 at android.view.View$PerformClick.run(View.java:19749) 12 at android.os.Handler.handleCallback(Handler.java:739) 13 at android.os.Handler.dispatchMessage(Handler.java:95) 14 at android.os.Looper.loop(Looper.java:135) 15 at android.app.ActivityThread.main(ActivityThread.java:5221) 16 at java.lang.reflect.Method.invoke(Native Method) 17 at java.lang.reflect.Method.invoke(Method.java:372) 18 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 19 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
###ソースコード
activity_main.xml
XML
1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout 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/container" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 android:orientation="vertical" 9 tools:context="sfw.tabtest.MainActivity"> 10 11 <FrameLayout 12 android:id="@+id/content" 13 android:layout_width="match_parent" 14 android:layout_height="0dp" 15 android:layout_weight="0.65"> 16 17 <fragment 18 android:id="@+id/fragment" 19 android:name="sfw.tabtest.main" 20 android:layout_width="match_parent" 21 android:layout_height="match_parent" /> 22 </FrameLayout> 23 24 <android.support.design.widget.BottomNavigationView 25 android:id="@+id/navigation" 26 android:layout_width="match_parent" 27 android:layout_height="wrap_content" 28 android:layout_gravity="bottom" 29 android:background="?android:attr/windowBackground" 30 app:menu="@menu/navigation" /> 31 32</LinearLayout>
MainActivity.java(修正前)
Java
1package sfw.tabtest; 2 3import android.os.Bundle; 4import android.support.annotation.NonNull; 5import android.support.design.widget.BottomNavigationView; 6import android.support.v4.app.Fragment; 7import android.support.v4.app.FragmentManager; 8import android.support.v4.app.FragmentTransaction; 9import android.support.v7.app.AppCompatActivity; 10import android.view.MenuItem; 11 12public class MainActivity extends AppCompatActivity { 13 14 private Fragment fragment; 15 private FragmentManager fragmentManager; 16 17 private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener 18 = new BottomNavigationView.OnNavigationItemSelectedListener() { 19 20 @Override 21 public boolean onNavigationItemSelected(@NonNull MenuItem item) { 22 switch (item.getItemId()) { 23 case R.id.navigation_home: 24 fragment = new main(); 25 break; 26 case R.id.navigation_upload: 27 fragment = new upload(); 28 break; 29 case R.id.navigation_setting: 30 fragment = new Setting(); 31 break; 32 } 33 final FragmentTransaction transaction = fragmentManager.beginTransaction(); 34 transaction.replace(R.id.content, fragment).commit(); 35 return true; 36 } 37 }; 38 39 @Override 40 protected void onCreate(Bundle savedInstanceState) { 41 super.onCreate(savedInstanceState); 42 setContentView(R.layout.activity_main); 43 44 fragment = new main(); 45 BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); 46 navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); 47 } 48}
MainActivity.java(修正後ーこの構文で動きました)
Java
1package sfw.tabtest; 2 3import android.os.Bundle; 4import android.support.annotation.NonNull; 5import android.support.design.widget.BottomNavigationView; 6import android.support.v4.app.Fragment; 7import android.support.v4.app.FragmentManager; 8import android.support.v4.app.FragmentTransaction; 9import android.support.v7.app.AppCompatActivity; 10import android.view.MenuItem; 11 12public class MainActivity extends AppCompatActivity { 13 14 private Fragment fragment; 15 private FragmentManager fragmentManager; 16 17 private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener 18 = new BottomNavigationView.OnNavigationItemSelectedListener() { 19 20 @Override 21 public boolean onNavigationItemSelected(@NonNull MenuItem item) { 22 switch (item.getItemId()) { 23 case R.id.navigation_home: 24 fragment = new main(); 25 break; 26 case R.id.navigation_upload: 27 fragment = new upload(); 28 break; 29 case R.id.navigation_setting: 30 fragment = new Setting(); 31 break; 32 } 33 final FragmentTransaction transaction = fragmentManager.beginTransaction(); 34 transaction.replace(R.id.content, fragment).commit(); 35 return true; 36 } 37 }; 38 39 @Override 40 protected void onCreate(Bundle savedInstanceState) { 41 super.onCreate(savedInstanceState); 42 setContentView(R.layout.activity_main); 43 //追記 44 fragmentManager = getSupportFragmentManager(); 45 //追記終わり 46 fragment = new main(); 47 BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); 48 navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); 49 } 50}
fragment_main.xml
XML
1package sfw.tabtest; 2 3import android.os.Bundle; 4import android.support.v4.app.Fragment; 5import android.view.LayoutInflater; 6import android.view.View; 7import android.view.ViewGroup; 8 9 10public class main extends Fragment { 11 12 public main() { 13 } 14 @Override 15 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 16 return inflater.inflate(R.layout.fragment_main, container, false); 17 } 18}
main.java
java
1package sfw.tabtest; 2 3import android.os.Bundle; 4import android.support.v4.app.Fragment; 5import android.view.LayoutInflater; 6import android.view.View; 7import android.view.ViewGroup; 8 9 10public class main extends Fragment { 11 12 public main() { 13 } 14 @Override 15 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 16 return inflater.inflate(R.layout.fragment_main, container, false); 17 } 18}
※fragment_upload.xml,fragment_setting.xml,upload.java,Setting.javaも基本的な構造は同じです。
###試したこと
build.gradle(Modulu:app)に
compile 'com.android.support:design:25.0.0'
を挿入してみました。
###参考にしたサイト等
Android Bottom Navigation View Example
stackoverflowーset new theme for app when switch fragment
###バージョン、デバッグ環境
PC:Windows10
AndroidStudio:バージョン2.3
デバッグ環境
Genymotion:バージョン2.8.1
Custom Phone-5.0.0(API21)
回答2件
あなたの回答
tips
プレビュー