65186


## 実現したいこと

フラグメント間を遷移しながら、各フラグメントでActivityを実行しようとしています。

具体的には、以下の記事で紹介されているプログラムを組み合わせようとしています。

フラグメント１（画面遷移１ページ目）では、文字をフォームに入力してボタンを押すとフラグメント２ではなく、[[Android & Kotlin ]
アプリの画面遷移とActivity間のデータ転送](https://akira-watson.com/android/kotlin/activity-
trans-data.html)で紹介されているような`SubActivity`の画面が表示されるということを実行したいです。

参考記事  
[[kotlin] ViewPagerでフラグメントを切り替える](https://qiita.com/YS-
BETA/items/091a84961d5b56fced2b)

[[Android & Kotlin ] アプリの画面遷移とActivity間のデータ転送](https://akira-
watson.com/android/kotlin/activity-trans-data.html)

ファイル構造  
[![画像の説明をここに入力](https://i.stack.imgur.com/Slhl8.png)](https://i.stack.imgur.com/Slhl8.png)

## エラーと問題

FragmentからActivityを呼ぶときに参考にしている、コードの記事  
[KotlinでFragmentからActivityへのコールバックでのスマートキャストについて](https://qiita.com/sansuke05/items/f5c8c4bb644d5339ddaf)  
[【Androidアプリ開発】FragmentからActivityのメソッドを実行する、一番簡単な方法](https://calculus-
app.com/blog/develop_android/android_fragment/167)

### エラー１

`SamplePageAdapter.kt`で以下のエラーが表示されますが、Fragment同士の画面遷移だけでは表示されなかったエラーのため、解決法がわからず困っています。

[code]

    too many arguments for private constructor...
    Unresolved reference
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/gLaQw.png)](https://i.stack.imgur.com/gLaQw.png)

### エラー2

`Sample1Fragment.kt`で、フラグメント（Sample1Fragment.kt）からアクティビティ（Fragment1MainActivity)を呼び出す部分を、[KotlinでFragmentからActivityへのコールバックでのスマートキャストについて](https://qiita.com/sansuke05/items/f5c8c4bb644d5339ddaf)を見ながら書いています。

[![画像の説明をここに入力](https://i.stack.imgur.com/hi4ru.png)](https://i.stack.imgur.com/hi4ru.png)

[code]

      override fun onAttach(context: Context){
            //...
    
            if (context is FragmentListener){
                mListener = context
            }
        }
    
[/code]

で`Unresolved reference: Context)`と

[code]

        override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
            //...
    
            mListener?.let { it.onClickButton() }
        }
    
[/code]

で`onViewCreated override
nothing`とエラーが出ている状態で、今回のプロジェクトではどのように書き直せばいいかわからない状態なため、アドバイスをいただきたいです。

## 実行しているコード

掲載しているのは、４つのファイルですが、必要に応じて迅速に掲載しますのでコメントからご連絡いただけますと幸いです。

SamplePageAdapter.kt

[code]

    package com.example.fragact
    
    import androidx.fragment.app.Fragment
    import androidx.fragment.app.FragmentManager
    import androidx.fragment.app.FragmentStatePagerAdapter
    
    class SamplePagerAdapter(fm: FragmentManager, private val fragmentList: List<Fragment>) :
        FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
    
        // control fragments to show
        override fun getItem(position: Int): Fragment {
            return fragmentList[position]
        }
    
        // size of contents to set viewPager
        override fun getCount(): Int {
            return fragmentList.size
        }
    }
    
[/code]

Sample1Fragment.kt

[code]

    package com.example.fragact
    
    import android.os.Bundle
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.Button
    import android.widget.TextView
    import androidx.fragment.app.Fragment
    import androidx.fragment.app.FragmentManager
    import androidx.fragment.app.FragmentTransaction
    
    class Sample1Fragment : Fragment() {
    
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_sample1, container, false)
        }
    
        // fragment から Activityを呼び出す
        // Sample1FragmentからFragment1MainActivityに遷移したい
    
        interface FragmentListener {
            fun onClickButton()
        }
    
        private var mListener: FragmentListener? = null
    
        override fun onAttach(context: Context){
            //...
    
            if (context is FragmentListener){
                mListener = context
            }
        }
    
        override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
            //...
    
            mListener?.let { it.onClickButton() }
        }
    
    
    
    }
    
[/code]

Fragment1MainActivity.kt

[code]

    package com.example.fragact
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.app.Activity
    import android.content.Intent
    import android.util.Log
    import kotlinx.android.synthetic.main.activity_frag1main.*
    
    class Fragment1MainActivity : AppCompatActivity() {
    
        companion object {
            const val EXTRA_MESSAGE = "com.example.kotlinactivitydatatrans.MESSAGE"
        }
    
        private val RESULT_SUBACTIVITY = 1000
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_frag1main)
    
            button.setOnClickListener {
                if (editText.text != null) {
                    val intent = Intent(applicationContext, Fragment1SubActivity::class.java)
                    val str = editText.text.toString()
                    Log.d("debug", str)
    
                    intent.putExtra(EXTRA_MESSAGE, str)
                    startActivityForResult(intent, RESULT_SUBACTIVITY)
    
                    editText.setText("")
    
                }
            }
        }
    
        // to get a result form SubActivity
        override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
            super.onActivityResult(requestCode, resultCode, intent)
    
            if (resultCode == Activity.RESULT_OK &&
                requestCode == RESULT_SUBACTIVITY && intent != null
            ) {
    
                val res = intent.extras?.getString(EXTRA_MESSAGE) ?: ""
                textView.text = res
            }
        }
    }
    
[/code]

AndroidManifest.xml

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.fragact">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name=".Fragment1MainActivity"
                android:label="@string/app_name" >
            </activity>
            <activity
                android:name=".Fragment1SubActivity"
                android:label="@string/app_name" >
            </activity>
    
        </application>
    
    </manifest>
    
[/code]

## 実現できていること

[[kotlin] ViewPagerでフラグメントを切り替える](https://qiita.com/YS-
BETA/items/091a84961d5b56fced2b)

[[Android & Kotlin ] アプリの画面遷移とActivity間のデータ転送](https://akira-
watson.com/android/kotlin/activity-trans-data.html)

はそれぞれ、単独では動かせています。

また、エラー１の`BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT`に関しても、[[kotlin]
ViewPagerでフラグメントを切り替える](https://qiita.com/YS-
BETA/items/091a84961d5b56fced2b)単独で動かした時はエラーは出ませんでした。

## 実行環境

Android Studio 3.5.3  
Kotlin plugin 1.3.50


CC BY-SA 4.0
2020-03-09T10:53:10.877
63697
2020-03-29T01:10:02.823
question
java android android-studio xml kotlin
Androidアプリ開発でFragmentからActivityを呼ぶときのエラーを解決できない


> エラー１  
>  too many arguments for public constructor...  
>  Unresolved reference

依存関係がうまく解決出来ておらず、古いfragmentパッケージを参照している可能性が高いです。  
appのbuild.gradleへ以下を追加してみてください。

`implementation 'androidx.fragment:fragment-ktx:1.2.3'`

また、現在FragmentStateAdapterはdeprecatedとなっています。  
FragmentStateAdapterの使用が推奨されています。  
<https://developer.android.com/reference/androidx/fragment/app/FragmentStatePagerAdapter>  
<https://developer.android.com/reference/androidx/viewpager2/adapter/FragmentStateAdapter>

> エラー2  
>  onViewCreated override nothing

kotlinはnull可、不可によっても型を認識します。以下の様に変更してみてください。

`override fun onViewCreated(view: View?, savedInstanceState: Bundle?)`  
=> `override fun onViewCreated(view: View, savedInstanceState: Bundle?)`


CC BY-SA 4.0
2020-03-29T01:10:02.823
65186
2020-03-29T01:10:02.823
39410
63697
answer