Передача значения из действия во фрагмент - PullRequest
0 голосов
/ 03 января 2019

В моем проекте есть навигационная активность снизу, и в ней два фрагмента.Я пытаюсь передать значение из Activity ---> FragmentOne, а затем из FragmentOne ---> FragmentTwo.Любая помощь приветствуется.

Используемый язык

Kotlin

Ожидание

1)Pass value from Activity to Fragment
2)Send value from Fragment to Fragment

Ошибка

Null Pointer Exception

Код

Активность

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test)
        var testName:String=intent.getStringExtra("name")
        println("TestCLLicked: $testName")
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
        replaceFragment(TestFragmentOne.newInstance(),TestFragmentOne.TAG)
    }

TestFragmentOne

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            var st:String=arguments!!.getString("name")
             println("TestCLLicked: $testName")

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вы можете пойти разными путями, но, учитывая вашу текущую реализацию (используя newInstance), я бы пошел с использованием вашей родительской активности в качестве посредника, работая так:

1) Создайте класс BaseFragment, который вашTestFragmentOne и TestFragmentTwo будут расширяться и содержать ссылку на вашу родительскую активность (здесь она называется «MainActivity»):

abstract class BaseFragment : Fragment() {

     lateinit var ACTIVITY: MainActivity

     override fun onAttach(context: Context) {
         super.onAttach(context)
         ACTIVITY = context as MainActivity
     }
}

2) Затем в своей активности убедитесь, что вы объявили свою переменную как поле:

class MainActivity : AppCompatActivity() {

     var textVariable = "This to be read from the fragments"
     ...
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         textVariable = "I can also change this text"
         ...
     }
}

3) Затем из каждого фрагмента вы можете получить доступ к своей переменной, используя экземпляр, унаследованный от вашего BaseFragment:

 class TestFragmentOne : BaseFragment() {

      override fun onActivityCreated(savedInstanceState: Bundle?) {
          super.onActivityCreated(savedInstanceState)
          val incomingText = ACTIVITY.textVariable
          println("Incoming text: "+incomingText)

          // You can also set the value of this variable to be read from 
          // another fragment later
          ACTIVITY.textVariable = "Text set from TestFragmentOne"
      }
 }
0 голосов
/ 03 января 2019

Для этого сценария я использую статическое намерение и передаю данные по нему.

    static final Intent storageIntent = new Intent();

    storageIntent.putExtra("name", "value");
...