Как вернуть контроль от Фрагмента к Деятельности? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть простой CalculatorActivity с последовательно показанными фрагментами:

  1. InputFragment //requests two input values for calclation
  2. ResultFragment // show the result of the calculation

Для простоты предположим, я хочу вычислить сумму двух чисел. Я запускаю CalculatorActivity, который немедленно загружает InputFragment через:

fun replaceFragment(resId : Int, newFragment : Fragment){
    this.supportFragmentManager?.beginTransaction()?.replace(resId, newFragment)?.addToBackStack(null)?.commit()
}

resId - идентификатор ресурса контейнера, в котором будет раздуваться фрагмент. newFragment - это новый фрагмент, который нужно надуть. Здесь, на этом первом шаге, я вызываю CalculatorActivity s onCreate():

replaceFragment(R.id.container, InputFragment.getInstance())

ТАК ЧТО это работает отлично.

Но когда я ввожу необходимые числа в InputFragment, как я могу переслать значения из InputFragment обратно в вызывающий CalculatorActivity, чтобы он мог продолжить и накачать ResultFragment в тот же контейнер, чтобы показать результат расчета?

Ответы [ 3 ]

0 голосов
/ 20 марта 2019

Вы можете иметь значение в качестве переменной в упражнении и из фрагмента сделать

CalculatorActivity myActivity = (CalculatorActivity)getActivity()
myActivity.setInputValues(fragmentInputValues)
myActivity.doSomethingWithTheValues()
0 голосов
/ 20 марта 2019

Если вы учитесь, и это просто для удовольствия, тогда не стесняйтесь делать прямое приведение к активности и получать доступ к ее общедоступным методам.Однако в реальной практике я бы никогда этого не сделал.

Лучше всего было бы использовать реализацию интерфейса для родительского действия.

пример: INTERFACE CLASS

interface IBaseActivityCallback {
    fun onInputValuesReady(myObjectOfValues: MyObject)
}

ACTIVITY CLASS

class CalculatorActivity : AppCompatActivity(), IBaseActivityCallback {
     override fun onInputValuesReady(myObjectOfValues: MyObject){
          //handle inflate or usage of values
     }
}

FRAGMENT CLASS

lateinit var baseActivityCallback: IBaseActivityCallback

override fun onAttach(context: Context) {
     super.onAttach(context)
     //NOTE* wrap in try/catch if context can be something else
     baseActivityCallback = context as IBaseActivityCallback
}

fun someButtonClicked(){
    baseActivityCallback.onInputValuesReady(myObjectToPass)
}

Я подумал, что мне не нужно объяснять создание объекта для хранения переменных или кнопок, которые были нажаты и т.д., поэтому я просто продолжилэта часть для вас общая.

0 голосов
/ 20 марта 2019

Вы всегда можете получить включающее действие из любого фрагмента (используя getActivity), затем привести его к нужному типу и использовать свой собственный метод setValues.Проверьте это: https://developer.android.com/training/basics/fragments/communicating

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...