как передать данные между двумя фрагментами назначения Если я коснусь меню в контроллере навигации? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь использовать навигационный контроллер.У меня есть вид снизу навигации.это находится на моей MainActivity, и оно инициируется с помощью кода ниже на:

class MainActivity : AppCompatActivity() {

    lateinit var navController : NavController
    lateinit var logoHeaderImageView : ImageView
    var toolbarMenu : Menu? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        logoHeaderImageView = findViewById(R.id.header_lakuin_image_view)

        navController = Navigation.findNavController(this,R.id.nav_main_host_fragment)



        setupBottomNavMenu(navController)
        setupActionBar(navController)



    }

    fun setupBottomNavMenu(navController: NavController) {
        NavigationUI.setupWithNavController(bottom_navigation_view,navController)
    }

    fun setupActionBar(navController: NavController) {
        setSupportActionBar(main_activity_toolbar)
        main_activity_toolbar.title = ""


        val appBarConfiguration = AppBarConfiguration(
            setOf(
                // set some destination as the top hierarchy destination, to make the up button doesn't show.
                R.id.destination_home,
                R.id.destination_order,
                R.id.destination_favourite,
                R.id.destination_cart,
                R.id.destination_profile

            ))

        NavigationUI.setupWithNavController(main_activity_toolbar,navController,appBarConfiguration)
    }


    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_main_toolbar, menu)
        toolbarMenu = menu
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item)
    }




}

вот мой нижний вид навигации: enter image description here

Поэтому я хочу передать данные из моего HomeFragment (дом назначения) в OderFragment (заказ назначения).Я обычно использую bundle или safeArgs для передачи данных, подобных приведенному ниже коду:

var bundle = bundleOf("amount" to amount)
view.findNavController().navigate(R.id.confirmationAction, bundle)

, но я не знаю, где разместить этот код, если я хочу передать данные из моего HomeFragment в OderFragment

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

Вы можете использовать общую модель представления между фрагментами:

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    private lateinit var model: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
        itemSelector.setOnClickListener { item ->
            // Update the UI
        }
    }
}

class DetailFragment : Fragment() {

    private lateinit var model: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        model = activity?.run {
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        } ?: throw Exception("Invalid Activity")
        model.selected.observe(this, Observer<Item> { item ->
            // Update the UI
        })
    }
}

Более подробную информацию можно найти здесь:

https://developer.android.com/topic/libraries/architecture/viewmodel#sharing

0 голосов
/ 14 февраля 2019

Просто так:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val bundle = Bundle()
    bundle.putString("myname","Hussnain")
    return when(item.itemId){
        R.id.aboutFragment ->{
            navController.navigate(R.id.aboutFragment,bundle)
            return true
    }else -> {
            NavigationUI.onNavDestinationSelected(item,navController) || super.onOptionsItemSelected(item)
        }
    }
}

Навигация:

 <fragment android:id="@+id/aboutFragment"
 android:name="com.cinderellaman.general.ui.fragments
 .AboutFragment"
  android:label="about_fragment"
  tools:layout="@layout/about_fragment">
  <argument android:name="myname" app:argType="string"/>
</fragment>

фрагмент:

val args: AboutFragmentArgs by navArgs()
name.text = args.myname
0 голосов
/ 14 февраля 2019

При использовании NavigationUI.setupWithNavController(bottom_navigation_view,navController) (или, если вы используете navigation-ui-ktx расширение Kotlin bottom_navigation_view.setupWithNavController(navController)), вы не можете передавать какие-либо настраиваемые аргументы адресатам - важной частью глобальной навигации является то, что они всегда берут васна тот же экран в том же состоянии.

Как правило, вы должны хранить данные, такие как текущая сумма, отдельно от аргументов навигации - будь то в постоянной базе данных, SharedPreferences или в каком-то другом месте, которое могло бы пережить смерть процесса, позволяя пользователям продолжать то, что они делают, даже после перезагрузки телефона и т. д.

Однако, если для этого необходимо использовать аргументы навигации, вы можете заранее установить аргумент по умолчанию для пункта назначения (т. е.всякий раз, когда ваша сумма изменяется):

NavDestination orderDestination = navController.graph.findNode(R.id.destination_order)
orderDestination.addArgument("amount", NavArgument.Builder()
    .setType(NavType.FloatType)
    .setDefaultValue(amount)
    .build())

Впоследствии ваш BottomNavigationView триггер R.id.destination_order автоматически включит этот аргумент вместе с вашим новым значением amount по умолчанию.

0 голосов
/ 14 февраля 2019
Post data:
Fragment fragment = new OderFragment();
                Bundle bundle = new Bundle();
                bundle.putString("key", "value");
                fragment.setArguments(bundle);

                FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.frame_container, fragment);
                transaction.addToBackStack(null);
                transaction.commit();

Receive data:
Bundle bundle = this.getArguments();
            if (bundle != null) {
                myInt = bundle.getString("key");
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...