Перейдите к фрагменту по щелчку FAB (Компоненты архитектуры навигации) - PullRequest
0 голосов
/ 28 июня 2018

Я не представляю, как с помощью нового компонента архитектуры навигации перейти от моего главного экрана (с FloatingActionButton, привязанным к BottomAppBar) к другому экрану без панели приложения.

Когда я нажимаю на панель, я хочу, чтобы мой следующий экран (фрагмент?) Скользил справа. Проблема в том, куда мне положить мой BottomAppBar? Если я добавлю его в свой MainActivity, то у меня возникнет проблема, что FloatingActionButton не имеет набора NavController. Я также не могу поместить свой BottomAppBar в свой фрагмент. Я в растерянности.

Ответы [ 4 ]

0 голосов
/ 28 мая 2019

Если вы по какой-то причине захотели перейти к определенному фрагменту (не к звездному) в начале, а также вам нужны графики для одного действия, вот что я предлагаю: этот метод запускает действие

companion object {

        const val REQUEST_OR_CONFIRM = "request_or_confirm"
        const val IS_JUST_VIEW = "IS_JUST_VIEW"
        const val MODEL = "model"

        fun open(activity: Activity, isRequestOrConfirm: Boolean, isJustView: Boolean = false, model: DataModel? = null) {
            val intent = Intent(activity, HostActivity::class.java)
            intent.putExtra(REQUEST_OR_CONFIRM, isRequestOrConfirm)
            intent.putExtra(IS_JUST_VIEW, isJustView)
            intent.putExtra(MODEL, model)
            activity.startActivity(intent)
        }
    }

, а затем в методе onCreate Host Activity сначала решите, какой граф использовать, а затем передайте пакет намеренных дополнений, чтобы начальный фрагмент мог решить, что делать:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_purchase_nav)
        if (intent.getBooleanExtra(REQUEST_OR_CONFIRM, true)) {
            findNavController(R.id.nav_host_fragment).setGraph(R.navigation.nav_first_scenario, intent.extras)
        } else {
            findNavController(R.id.nav_host_fragment).setGraph(R.navigation.nav_second_scenario, intent.extras)
        }
    }

и вот как вы можете решить, что делать в стартовом фрагменте:

if (arguments != null && arguments!!.getBoolean(HostActivity.IS_JUST_VIEW)){
    navigateToYourDestinationFrag(arguments!!.getParcelable<DataModel>(HostActivity.MODEL))
}

, а затем перемещайтесь, как обычно:

private fun navigateToYourDestinationFrag(model: DataModel) {
        val action = StartFragmentDirections.actionStartFragmentToOtherFragment(model)
        findNavController().navigate(action)
    }

вот как может выглядеть ваш график в случае, если вы хотите перейти к третьему фрагменту в начале enter image description here

PS: убедитесь, что вы обработаете кнопку возврата на третьем фрагменте, здесь решение

UPDATE : как упоминалось в EpicPandaForce, вы также можете начать действия, используя компоненты навигации: чтобы сделать это, сначала добавьте Activity в свой существующий график, либо с помощью значка + (который у меня не работал), либо добавив вручную в xml:

 <activity
        android:id="@+id/secondActivity"
        tools:layout="@layout/activity_second"
        android:name="com.amin.SecondActivity" >
    </activity>

вы также можете добавлять аргументы и использовать их так же, как и во фрагменте, с помощью navArgs ()

 <activity
        android:id="@+id/secondActivity"
        tools:layout="@layout/activity_second"
        android:name="com.amin.SecondActivity" >
        <argument
            android:name="testArgument"
            app:argType="string"
            android:defaultValue="helloWorld" />
    </activity>

в koltin, вот как вы будете использовать аргумент. Сначала объявите аргументы с типом сгенерированного класса, названного в соответствии с вашей активностью, в этом случае SecondActivityArgs в верхней части вашего класса активности:

val args: SecondActivityArgsby by navArgs()

и затем вы можете использовать его так:

print(args.testArgument)
0 голосов
/ 06 июля 2018

Сегодня столкнулся с этой проблемой, и я обнаружил, что есть простое и элегантное решение.

val navController = findNavController(R.id.navHostFragment)
Navigation.setViewNavController(fabAdd, navController)
fabAdd.setOnClickListener {
   navController.navigate(R.id.addSymbolFragment)
}  

Это заботится о навигации. Затем вы должны контролировать видимость вашего BottomAppBar внутри вашего Activity.

0 голосов
/ 23 декабря 2018

Поместите его в MainActivity и установитеOnClickListener в onStart() действия, и оно будет работать нормально.

override fun onStart() {
  super.onStart()
  floatingActionButton.setOnClickListener {
    it.findNavController().navigate(R.id.yourFragment)
   }
}

Примечание. Это решение похоже на взлом, и лучше всего следовать Activity LifeCycle и setUp OnClickListener, когда действие готово к взаимодействию.

Аналогичный вопрос [решено]

0 голосов
/ 28 июня 2018

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

activity?.fab?.setOnClickListener { 
    /*...*/
    findNavController().navigate(R.id.action_firstFragment_to_secondFragment, mDataBundle)
}

Вы можете скрыть BottomAppBar от другого действия следующим образом

(activity as AppCompatActivity).supportActionBar?.hide()

Убедитесь, что вы .show() BottomAppBar возвращаясь к предыдущему фрагменту

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