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

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

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

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

4864閲覧

Androidアプリ開発でFragmentからActivityを呼ぶときにエミュレーターでシャットダウンが起きるエラーを解決する方法について

退会済みユーザー

退会済みユーザー

総合スコア0

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/03/11 11:55

編集2020/03/12 05:01

前提・実現したいこと

Androidアプリ開発で、FragmentからActivityを実行しようとしています。
開発言語はKotlinです。

具体的には、Fragment間とFragment-Activity間の画面遷移を両立したアプリ作成したいです。

ファイル構成は以下のようになっており、

  • Fragment間の画面遷移は、「FragmentOne, FragmentTwo」
  • Fragment-Activity間の遷移は、「FragmentTwo, FormActivityOne」

 で行われます。

files

発生している問題・エラーメッセージ

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

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

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

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

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

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

m.ts10806

2020/03/11 12:52

回答依頼いただきましたがあいにくAndroid特化のものですとほとんど未経験なもので、ご期待には沿えません(Javaだけならまだ良いのですけど) 回答依頼出す際は質問のメインとなるタグのスコアなどもご確認ください。
jimbe

2020/03/11 19:45

> 開発言語はKotlinです でしたら java のタグは外して頂けますか.
guest

回答1

0

ベストアンサー

スタックトレースの読み方ですが、大事なのは一番後ろの Caused by: の例外内容と、それが起きた場所です。

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)

今回は Button の setOnClickListener メソッドを null に対して呼び出そうとしているということで、つまりボタンが null だってことです。それが FormActivityOne.kt の 29 行で起きてるので、その場所を見ると、

Java

1 bntDate.setOnClickListener{ 2 val datePickerDialog = DatePickerDialog(this@FormActivityOne, DatePickerDialog.OnDateSetListener 3 { view, year, monthOfYear, dayOfMonth -> 4 editBirth.setText("" + year + "-" + (monthOfYear+1) + "-" + dayOfMonth) 5 }, year, month, day) 6 datePickerDialog.show() 7 }

bntDate が null だと思われます。で、btnDate を確認すると、

Java

1 override fun onCreate(savedInstanceState: Bundle?) { 2 super.onCreate(savedInstanceState) 3 setContentView(R.layout.activity_main) 4 5 /** 6 * 生年月日取得のCalendar 7 */ 8 val bntDate = findViewById<Button>(R.id.btnDate)

ということで、FormActivityOne.kt なのに間違って R.layout.activity_main を読み込んでいるために、あるはずの view がないのでは。

投稿2020/03/11 18:35

hoshi-takanori

総合スコア7901

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問