导航组件以编程方式过渡动画

时间:2018-08-15 10:23:53

标签: android-fragments kotlin android-animation android-architecture-components android-architecture-navigation

昨天,我遇到一个问题,我需要在我的baseFragment中的nav_graph.xml中设置动画,并以编程方式从当前节点(包括enterAnim和exitAnim资源)获取动作对象。在这里找不到解决方案,所以我们开始吧。

首先,我们需要将动画文件夹中的动画添加到动画文件夹中,因为它很饿。

slide_in_left.xml

if( isset($_POST['update_order']) ){
  global $wpdb;
  if(!empty($_POST['updated_rows'])) {
    $updated_rows_json = $_POST['updated_rows'];
    $updated_rows_ary = json_decode($updated_rows_json, true);
    foreach ($updated_rows_ary as $updated_row) {
      $wpdb->update('data', array("order" => $updated_row['updated_order']) , array('id' => $updated_row['id']));
    }
  }
}

您可以在github或stackoverflow上轻松找到的其他动画。

这是我的nav_graph.xml片段,我们将从中进行过渡

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="250"
        android:fromXDelta="-100%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="0%" />
</set>

现在在KebabFragment.tk中,您将调用baseFragment方法进行过渡,以详细了解所需的kebab,然后popFromBackStack

<fragment
    android:id="@+id/kebabsFragment"
    android:name="com.kebabkrabby.kebabapp.KebabFragment"
    android:label="so many kebabs"
    tools:layout="@layout/fragment_kebab">

    <action
        android:id="@+id/action_kebabs_to_kebab_detail"
        app:destination="@id/kebabDetailFragment"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left" />
</fragment>

在我们的baseFragment.kt

//navigateAndClean(actionId, cleanFragmentId)
navigateAndClean(R.id.action_kebabs_to_kebab_detail, R.id.kebabsFragment)

有些人会问。嗨,Kebab先生,但是我该怎么internal fun navigateAndClean(actionId: Int, currentFragmentIdToClear: Int) { val navBuilder = NavOptions.Builder() val navController = Navigation.findNavController(getRootView()) val currNavigationNode = navController.graph.findNode(currentFragmentIdToClear) // NavDestination of kebabsFragment object in nav_graph.xml val action = currNavigationNode?.getAction(actionId) // finally we get this action_kebabs_to_kebab_detail action object action?.navOptions?.enterAnim?.let { //do we have animation or not? navBuilder.setEnterAnim(it) } action?.navOptions?.exitAnim?.let { navBuilder.setExitAnim(it) } navBuilder.setPopUpTo(currentFragmentIdToClear, true) //remove from backstack navController.navigate(actionId, null, navBuilder.build()) } Kebab先生会看着你,说:“伙计,看看这个世界,我们可以共同成就大事”

getRootView()

硬质烤肉串。享受。

0 个答案:

没有答案