Как сохранить данные, когда я нажимаю кнопку назад - PullRequest
1 голос
/ 13 февраля 2020

Я сделал приложение в kotlin через студию android. Теперь я использовал ViewModels для сохранения данных пользовательского интерфейса при ротации телефона (изменение конфигурации), я также использовал onSaveInstanceState для сохранения данных при нажатии кнопки назад, но это не так. работает.

Код ниже

fragOne.kt

class fragOne : Fragment() {
private lateinit var viewModel: fragViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    if(savedInstanceState!=null){
        with(savedInstanceState) {
        viewModel.num=getInt("number")
        }
    }

    // Inflate the layout for this fragment
    var binding = DataBindingUtil.inflate<FragmentFragoneBinding>(
        inflater,
        R.layout.fragment_fragone,
        container,
        false
    )

    viewModel = ViewModelProviders.of(this).get(fragViewModel::class.java)


    // function to update number
    fun updateNumber()
    {
        binding.number.text="${viewModel.num}"
    }

    updateNumber()

    // setting on Click listener for add button
    binding.add.setOnClickListener()
    {
        viewModel.addFive()
        updateNumber()
    }

    // setting on on Click Listener for minus button
    binding.minus.setOnClickListener()
    {
        viewModel.minusOne()
        updateNumber()
    }


    return binding.root
}




override fun onSaveInstanceState(outState: Bundle) {
    // Save the user's current game state
    outState?.run {
        putInt("number",viewModel.num)

    }

    // Always call the superclass so it can save the view hierarchy state
    if (outState != null) {
        super.onSaveInstanceState(outState)
    }
}

}

ViewModelclass

class fragViewModel:ViewModel()
{

// Initializing num=0
var num=0

// Functions to add five or subtract one

fun addFive()
{
    num=num+5
}

 fun minusOne()
{
    num=num-1
}

}

пожалуйста, скажите мне, потому что данные не сохраняются, когда я нажимаю назад

1 Ответ

1 голос
/ 13 февраля 2020

Вы можете переопределить onBackPressed для сохранения состояния:

Как реализовать onBackPressed () во фрагментах?

Не забудьте вызвать super, так что это также выполните команду back!

Вы также можете сделать следующее:

// This callback will only be called when MyFragment is at least Started.
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

Действительно хорошее чтение: https://developer.android.com/guide/navigation/navigation-custom-back

Обратная навигация - это то, как пользователи перемещаются назад по истории экранов, которые они ранее посещали. На всех устройствах Android предусмотрена кнопка «Назад» для этого типа навигации, поэтому вам не следует добавлять кнопку «Назад» в пользовательский интерфейс вашего приложения. В зависимости от устройства пользователя Android эта кнопка может быть физической кнопкой или программной кнопкой.

Ссылка:

Как отображать предупреждающее сообщение, когда кнопка возврата нажатие на фрагменты


Пример:

Убедитесь, что ваша активность расширяется AppCompatActivity

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = ViewModelProviders.of(this).get(fragViewModel::class.java)

        val prefs = activity.getSharedPreferences("Key")
        int num = prefs.get("number", -999)
        if(num != -999) {
               viewModel.num = num
        }


        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            prefs.edit().putInt("number", viewModel.num).apply()
        }
    }
    ...
}
...