これは私がやろうとしていることです。
ArrayList
を設定しますFragmentActivity
コンテナー内のオブザーバーからその配列を取得します(すべてのフラグメントをホストするアクティビティ)それで、私がしたことは次のとおりです。
最初に、設定してデータを取得する場所からSharedViewModel
を作成しました。
_class SharedViewModel: ViewModel() {
var personArrayObj:MutableLiveData<ArrayList<Person>> = MutableLiveData()
fun setPersonArray(personArray:ArrayList<Person>){
personArrayObj.value = personArray
}
val getPersonArray:LiveData<ArrayList<Person>>
get() = personArrayObj
}
_
ここで、すべてのフラグメントの作成をホストするViewModel
内にこのMainActivity
をインスタンス化します。そのため、そのセットをフラグメント化するどこからでもArrayData
を取得できます。
_class MainActivity: FragmentActivity(){
private lateinit var viewModel:SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProviders.of(this).get(SharedViewModel::class.Java)
viewModel.getPersonArray.observe(this, Observer { it:ArrayList<Person>
Log.d("Array:",""+it)
})
}
}
_
次に、最後に行う必要があるのは、任意のフラグメントからその配列の値を設定することです。値が変更された場合、ホストアクティビティがトリガーされるため、これを行うには、単純にviewModel.setValue(personArray)
希望のFragmentで。
フラグメント内でSharedViewModel
をインスタンス化しようとすると、この問題が発生します。
主張してみました!! nullの場合はletも使用しますが、機能しません。どこから来るのか、FragmentActivity
が必要だと思います
viewLifecycleOwner
の代わりにactivity
を使用すると、FragmentまたはFragmentActivity?
手がかりはありますか?
感謝します。
事をonCreateView()ではなくonActivityCreated()に入れてください...これはnullAcable()の問題を解決します...フラグメントのライフサイクルによると、onActivityCreated()はonCreareView()の後にあります...そしてそしてonActivityCreated()の呼び出しでアクティビティが作成されます...したがって、getActivity()は作成されたアクティビティを返します