前提・実現したいこと
Androidアプリ開発で、FragmentからActivityを実行しようとしています。
開発言語はKotlinです。
具体的には、Fragment間とFragment-Activity間の画面遷移を両立したアプリ作成したいです。
-
Fragment間の画面遷移は、[kotlin] ViewPagerでフラグメントを切り替えるの記事を参考に
-
Fragment-ActivityのActivityは、Kotlinページ遷移 フォーム intent RadioButtonの記事に掲載されているコードを参考にしています。
ファイル構成は以下のようになっており、
- Fragment間の画面遷移は、「FragmentOne, FragmentTwo」
- Fragment-Activity間の遷移は、「FragmentTwo, FormActivityOne」
で行われます。
発生している問題・エラーメッセージ
FragmentTwoからFormActivityOneを呼び出すときに、ビルドでは問題が起こらないのですが、エミュレータで起動して、FragmentTwo
のボタンを押すと、FormActivityOne
に移動せずにクラッシュします。
強制的にアプリが落ちて、エミュレータ上では何も出ないのですが、Android StudioのLogcat
では以下のエラーメッセージが表示されていました。
プログラム上の文法などのエラーではなく、エラー内容の理解と解決策がわからず、困っている状態です。
2020-03-11 20:47:33.241 3016-3016/com.example.transition W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@1c9a799 2020-03-11 20:47:33.280 3016-3016/com.example.transition D/AndroidRuntime: Shutting down VM --------- beginning of crash 2020-03-11 20:47:33.282 3016-3016/com.example.transition E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.transition, PID: 3016 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.transition/com.example.transition.FormActivityOne}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at com.example.transition.FormActivityOne.onCreate(FormActivityOne.kt:29) at android.app.Activity.performCreate(Activity.java:7136) at android.app.Activity.performCreate(Activity.java:7127) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 2020-03-11 20:47:33.301 3016-3016/com.example.transition I/Process: Sending signal. PID: 3016 SIG: 9
該当のソースコード
MainActivity.kt
kotlin
1import androidx.appcompat.app.AppCompatActivity 2import android.os.Bundle 3import androidx.fragment.app.Fragment 4import kotlinx.android.synthetic.main.activity_main.* 5 6class MainActivity : AppCompatActivity() { 7 8 override fun onCreate(savedInstanceState: Bundle?) { 9 super.onCreate(savedInstanceState) 10 setContentView(R.layout.activity_main) 11 // make the list of fragment 12 val fragmentList = arrayListOf<Fragment>( 13 FragmentOne(), 14 FragmentTwo() 15 ) 16 17 // create instance of adapter 18 val adapter = SamplePagerAdapter(supportFragmentManager, fragmentList) 19 /// set adapter 20 viewPager.adapter = adapter 21 } 22} 23
FragmentTwo.kt
Kotlin
1import android.content.Intent 2import android.os.Bundle 3import android.view.LayoutInflater 4import android.view.View 5import android.view.ViewGroup 6import androidx.fragment.app.Fragment 7import kotlinx.android.synthetic.main.fragment_two.* 8 9class FragmentTwo : Fragment() { 10 11 override fun onCreateView( 12 inflater: LayoutInflater, container: ViewGroup?, 13 savedInstanceState: Bundle? 14 ): View? { 15 return inflater.inflate(R.layout.fragment_two, container, false) 16 } 17 18 override fun onActivityCreated(savedInstanceState: Bundle?) { 19 super.onActivityCreated(savedInstanceState) 20 btnClick.setOnClickListener(object:View.OnClickListener{ 21 22 // ここでActivityを呼ぶ 23 override fun onClick(v: View?) { 24 activity?.startActivity(Intent(context, FormActivityOne::class.java)) 25 } 26 27 }) 28 } 29 30}
FormActivityOne.kt
kotlin
1import android.app.DatePickerDialog 2import android.content.Intent 3import androidx.appcompat.app.AppCompatActivity 4import android.os.Bundle 5import android.view.View 6import android.widget.* 7import android.widget.RadioGroup 8import java.util.* 9 10 11class FormActivityOne : AppCompatActivity() { 12 13 override fun onCreate(savedInstanceState: Bundle?) { 14 super.onCreate(savedInstanceState) 15 setContentView(R.layout.activity_main) 16 17 /** 18 * 生年月日取得のCalendar 19 */ 20 val bntDate = findViewById<Button>(R.id.btnDate) 21 val editBirth = findViewById<EditText>(R.id.editBirth) 22 val calendar= Calendar.getInstance() 23 val year = calendar.get(Calendar.YEAR) 24 val month = calendar.get(Calendar.MONTH) 25 val day = calendar.get(Calendar.DAY_OF_MONTH) 26 27 bntDate.setOnClickListener{ 28 val datePickerDialog = DatePickerDialog(this@FormActivityOne, DatePickerDialog.OnDateSetListener 29 { view, year, monthOfYear, dayOfMonth -> 30 editBirth.setText("" + year + "-" + (monthOfYear+1) + "-" + dayOfMonth) 31 }, year, month, day) 32 datePickerDialog.show() 33 } 34 35 36 /** 37 * 新規登録ボタンを押して次のページへ繊維 38 */ 39 val btClick = findViewById<Button>(R.id.bt_add) 40 val listener = ClickListener() 41 btClick.setOnClickListener(listener) 42 } 43 44 private inner class ClickListener : View.OnClickListener { 45 override fun onClick(v: View?) { 46 val editNickname = findViewById<EditText>(R.id.editNickname) 47 val editBirth = findViewById<EditText>(R.id.editBirth) 48 49 50 /** 51 * ジェンダーラジオボタン 52 */ 53 val rg_gender: RadioGroup 54 val rb_men: RadioButton 55 val rb_women: RadioButton 56 val rb_other: RadioButton 57 var index = "" 58 59 rg_gender = findViewById(R.id.radioGroup) 60 rb_men = findViewById(R.id.rb_men) 61 rb_women = findViewById(R.id.rb_women) 62 rb_other = findViewById(R.id.rb_other) 63 64 if(rg_gender.checkedRadioButtonId != -1) { 65 if (rb_men.isChecked) 66 index = "Men" 67 else if (rb_women.isChecked) 68 index = "Women" 69 else if (rb_other.isChecked) 70 index = "Other" 71 } 72 73 74 /** 75 * 次のページに値を渡します 76 */ 77 val intent = Intent(applicationContext, FormActivityTwo::class.java) 78 intent.putExtra("nickname", editNickname.text.toString()) 79 intent.putExtra("birth", editBirth.text.toString()) 80 intent.putExtra("gender", index.toString()) 81 startActivity(intent) 82 83 } 84 } 85}
試したこと
AndroidManifest.xml
には、MainActivity以外の新たに作成したFormActivityOne、Two
も加えていますが、現在のエラーは解決していません。
xml
1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.transition"> 4 5 <application 6 android:allowBackup="true" 7 android:icon="@mipmap/ic_launcher" 8 android:label="@string/app_name" 9 android:roundIcon="@mipmap/ic_launcher_round" 10 android:supportsRtl="true" 11 android:theme="@style/AppTheme"> 12 <activity android:name=".MainActivity"> 13 <intent-filter> 14 <action android:name="android.intent.action.MAIN" /> 15 16 <category android:name="android.intent.category.LAUNCHER" /> 17 </intent-filter> 18 </activity> 19 <activity 20 android:name=".FormActivityOne" 21 android:label="@string/app_name" > 22 </activity> 23 <activity 24 android:name=".FormActivityTwo" 25 android:label="@string/app_name" > 26 </activity> 27 </application> 28 29</manifest>
補足情報(FW/ツールのバージョンなど)
Android Studio 3.5.3
回答1件
あなたの回答
tips
プレビュー