как сделать анимационный переход между фрагментами в навигации по ящику в android - PullRequest
0 голосов
/ 09 июля 2020

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

это мое основное действие

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration

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

        setSupportActionBar(toolbar)

        val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
        val navView: NavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)

        appBarConfiguration = AppBarConfiguration(setOf(
            R.id.nav_food_text_analysis,
            R.id.nav_recipe_analysis
        ), drawerLayout)
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = findNavController(R.id.nav_host_fragment)
        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }


}

это моя навигация xml

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mobile_navigation"
    app:startDestination="@id/nav_food_text_analysis">

    <fragment
        android:id="@+id/nav_food_text_analysis"
        android:name="com.example.nutritionfacts.ui.foodTextAnalysis.FoodAnalysisFragment"
        android:label="Food analysis"
        tools:layout="@layout/fragment_food_text_analysis" >
        <action
            android:id="@+id/action_nav_food_text_analysis_to_nav_recipe_analysis"
            app:destination="@id/nav_recipe_analysis"
            app:enterAnim="@anim/enter_from_right"
            app:exitAnim="@anim/exit_to_right"
            app:popEnterAnim="@anim/enter_from_right"
            app:popExitAnim="@anim/exit_to_right" />
    </fragment>
    <fragment
        android:id="@+id/nav_recipe_analysis"
        android:name="com.example.nutritionfacts.ui.recipeAnalysis.RecipeAnalysisFragment"
        android:label="Recipe analysis"
        tools:layout="@layout/fragment_recipe_analysis" >
        <action
            android:id="@+id/action_nav_recipe_analysis_to_nav_food_text_analysis2"
            app:destination="@id/nav_food_text_analysis"
            app:enterAnim="@anim/enter_from_right"
            app:exitAnim="@anim/exit_to_right"
            app:popEnterAnim="@anim/enter_from_right"
            app:popExitAnim="@anim/exit_to_right" />
    </fragment>
</navigation>

1 Ответ

0 голосов
/ 13 июля 2020

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

Я использую одно действие с несколькими фрагментами. Обязательно настройте навигационный график для ваших фрагментов, затем вызовите правильное действие FragmentDirections, используя setNavigationItemSelectedListener в основном действии.

В моем примере settingsFragment будет загружен с анимация, но aboutFragment не будет, так как она не вызывает функцию Directions.action.

MainActivity (внутри функции onCreate)

        /** Handle clicks in Nav Drawer **/
        val navigationView = findViewById<NavigationView>(R.id.navView)
        navigationView.setNavigationItemSelectedListener { menuItem ->
            Timber.d("Nav Drawer Item Clicked: %s", menuItem.title)
            when (menuItem.itemId) {
                R.id.settingsFragment -> {
                    navController.navigate(
                        RecipeListFragmentDirections
                        .actionRecipeListToSettingsFragment()
                    )
                }
                R.id.aboutFragment -> {
                    navController.navigate(R.id.aboutFragment)
                }
                R.id.refreshRecipes -> {
                    Timber.i("TODO: Implement repository refresh method call")
                }
            }

            true
        }

навигация. xml

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/navigation"
    app:startDestination="@id/recipeList">

    <fragment
        android:id="@+id/recipeList"
        android:name="com.jumptuck.recipebrowser2.recipelist.RecipeListFragment"
        tools:layout="@layout/fragment_recipe_list">
        <action
            android:id="@+id/action_recipeList_to_singleRecipeFragment"
            app:destination="@id/singleRecipeFragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_right"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_left" />
        <action
            android:id="@+id/action_recipeList_to_aboutFragment"
            app:destination="@id/aboutFragment"
            app:enterAnim="@anim/slide_in_left"
            app:exitAnim="@anim/slide_out_left"
            app:popEnterAnim="@anim/slide_in_right"
            app:popExitAnim="@anim/slide_out_right" />
        <action
            android:id="@+id/action_recipeList_to_settingsFragment"
            app:destination="@id/settingsFragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_right"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_left" />
    </fragment>

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

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