Сохранение данных из фрагмента в действии не будет работать
Настройка: у меня есть 2 актива с двумя динамически создаваемыми фрагментами
Операция Main содержит оба фрагмента в режиме ландшафта, еще только Fragment Main и запускает Activity Edit от ActivityForResult
Activity Edit содержит Fragment Edit
Activity Main имеет базу данных
Fragment Main получает список из Activity
Редактирование фрагмента изменяет список
Мой подход заключается в сохранении списка в действии, когда основной фрагмент, содержащий список, уничтожен.
Текущее состояние Данные не записываются вБаза данных, когда вызывается ActivityForResult, а также не в ландшафтном режиме.
Что меня смущает, так это то, что данные записываются при повороте дисплея, но я не обновляю список в MainActivity в любой момент
MainActivity
================
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getTable() // gets Data from DataBase
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.add(R.id.frame_main, MainFragment.newInstance(dbList, true), "mainFragment")
.commit()
} else {
// Destroys the Fragment because I want to load it with different config
var mainFragment = supportFragmentManager.findFragmentByTag("mainFragment") as MainFragment
mainFragment.onDestroyView()
// Checks if it is Landscape
if (TabletHelper.isLandscape(this)) {
supportFragmentManager.beginTransaction().replace(
R.id.frame_main,
MainFragment.newInstance(dbList, false),
"mainFragment"
).commit()
supportFragmentManager.beginTransaction().replace(
R.id.frame_edit,
EditFragment.newInstance(null, null, true, null),
"editFragment"
).commit()
} else {
supportFragmentManager.beginTransaction().replace(
R.id.frame_main,
MainFragment.newInstance(dbList, true),
"mainFragment"
).commit()
}
}
}
// interface implementation from the MainFragment
override fun passList(list: ArrayList<Product>) {
dbList.clear()
dbList.addAll(list)
}
// Write the list to the DataBase
override fun onDestroy() {
super.onDestroy()
productsDBHelper.writeAllProducts(dbList, TABLE_NAME_MAIN)
}
}
MainFragment
==============
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if(savedInstanceState != null && savedState == null) {
savedState = savedInstanceState.getBundle(BUNDLE)
}
if(savedState != null) {
productList.addAll(savedState!!.getParcelableArrayList<Product>(PRODUCT_LIST_KEY)!!)
}
savedState = null
//doing something with Layout...
}
}
// save bundel when onDestroyView is called
override fun onDestroyView() {
super.onDestroyView()
savedState = saveState()
}
// Interface to pass the data to the Activity
interface OnFragmentMainClicked {
fun passList(list: ArrayList<Product>)
//..
}
//creating Bundle for instance
private fun saveState():Bundle{
var state = Bundle()
state.putParcelableArrayList(PRODUCT_LIST_KEY,productList)
return state
}
// Save Instance
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
if (savedState != null ){
outState.putBundle(BUNDLE,savedState)
}else{
outState.putBundle(BUNDLE,saveState())
}
}
//My Thought was to save the Data always when when onDestroyView in the Fragment is called
override fun onDestroyView() {
super.onDestroyView()
savedState = saveState()
onFragmentMainClicked.passList(productList)
}
//But it is not working. Result is that it clears whole list