Сохранить данные из фрагмента в действии - PullRequest
0 голосов
/ 16 октября 2019

Сохранение данных из фрагмента в действии не будет работать

Настройка: у меня есть 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

1 Ответ

0 голосов
/ 17 октября 2019

Я не знаю, почему вы устанавливаете свой список в onDestroyView(). Шаги, чтобы сообщить, если вы хотите этот список, пока активность не будет живой. Итак, для достижения этого создайте другой метод, чтобы получить ваш список getList() внутри вашего интерфейса, который будет возвращать ваш список. Как вы должны реализовать оба passList(list: List<Type>) и getList(): List<Type>. Теперь возьмите глобальный объект списка в вашей деятельности, заполните метод passList(list) и верните глобальный объект списка (который уже заполнен). Затем просто вызовите getList() с объектом интерфейса. Я надеюсь, что вы получите свой список с помощью интерфейса. Надеюсь, это поможет. Дайте мне знать.

...