Java 此 NavController 未知操作

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/51325285/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 00:04:26  来源:igfitidea点击:

Action is unknown to this NavController

javaandroidandroid-architecture-componentsandroid-navigationandroid-jetpack

提问by Aleksey Kabanov

I'm providing data transfer between fragments in two different ways, first is working normal, while a safe data type cause run-time crash. I'm using that Android docs: https://developer.android.com/topic/libraries/architecture/navigation/navigation-implementing#Safe-args

我以两种不同的方式提供片段之间的数据传输,第一种是正常工作,而安全数据类型会导致运行时崩溃。我正在使用该 Android 文档:https: //developer.android.com/topic/libraries/architecture/navigation/navigation-implementing#Safe-args

Don't understand how could I resolve the problem. Thanks for your help

不明白我怎么能解决这个问题。谢谢你的帮助

07-13 11:40:07.986 8119-8119/com.flexdecision.ak_lex.navigationsimple E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.flexdecision.ak_lex.navigationsimple, PID: 8119
java.lang.IllegalArgumentException: navigation destination com.flexdecision.ak_lex.navigationsimple:id/transferAction is unknown to this NavController
    at androidx.navigation.NavController.navigate(NavController.java:669)
    at androidx.navigation.NavController.navigate(NavController.java:628)
    at androidx.navigation.NavController.navigate(NavController.java:690)
    at com.flexdecision.ak_lex.navigationsimple.InitialFragment.makeTransfer(InitialFragment.java:58)
    at com.flexdecision.ak_lex.navigationsimple.InitialFragment.lambda$onViewCreated
<?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/nav_graph"
    app:startDestination="@id/initialFragment">

    <fragment
        android:id="@+id/initialFragment"
        android:name="com.flexdecision.ak_lex.navigationsimple.InitialFragment"
        android:label="fragment_initial"
        tools:layout="@layout/fragment_initial">
        <action
            android:id="@+id/transferAction"
            app:destination="@+id/nextFragment" />
    </fragment>
    <fragment
        android:id="@+id/nextFragment"
        android:name="com.flexdecision.ak_lex.navigationsimple.NextFragment"
        android:label="fragment_next"
        tools:layout="@layout/fragment_next" >
        <argument
            android:name="firstName"
            android:defaultValue="none"
            app:type="string" />
        <argument
            android:name="lastName"
            android:defaultValue="none"
            app:type="string" />
    </fragment>
</navigation>
(InitialFragment.java:47) at com.flexdecision.ak_lex.navigationsimple.-$$Lambda$InitialFragment$shEoLbIe0sVhbTcJ2Al_FvBuU7g.onClick(lambda) at android.view.View.performClick(View.java:5198) at android.view.View$PerformClick.run(View.java:21147) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Navigation graph:

导航图:

<android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/nav_graph" />
</android.support.constraint.ConstraintLayout>

Activity layout:

活动布置:

import androidx.navigation.Navigation;

public class InitialFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_initial, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Button transactionBtn = view.findViewById(R.id.transaction);
        transactionBtn.setOnClickListener(v -> makeTransfer(v));
    }

    private void makeTransfer(View view) {
        Bundle bundle = new Bundle();
        bundle.putString("name", "Aleksey");
        Navigation.findNavController(view).navigate(R.id.transferAction, bundle);

        //Type safe passing data
        InitialFragmentDirections.TransferAction action = InitialFragmentDirections.transferAction();
        action.setLastName("Petrov");
        Navigation.findNavController(view).navigate(action);
    }
}

Sender:

发件人:

public class NextFragment extends Fragment {
    private static final String ARG_PARAM1 = "name";

    private String mParam1;
    private TextView firstName;

    public NextFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            Log.d("Next", "Param: " + mParam1);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_next, container, false);
    }


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        firstName = view.findViewById(R.id.firstName);
        TextView lastName = view.findViewById(R.id.lastNameTV);
        firstName.setText(mParam1);

        String ln = NextFragmentArgs.fromBundle(getArguments()).getLastName();
        lastName.setText(ln);
    }
}

Receiver:

接收者:

apply plugin: "androidx.navigation.safeargs"

dependencies {
    def nav_version = "1.0.0-alpha03"

    implementation "android.arch.navigation:navigation-fragment:$nav_version"
    implementation "android.arch.navigation:navigation-ui:$nav_version"
}

additional:

额外的:

private void makeTransfer(View view) {
    Bundle bundle = new Bundle();
    bundle.putString("name", "Aleksey");
    Navigation.findNavController(view).navigate(R.id.transferAction, bundle);

    //Type safe passing data 
    InitialFragmentDirections.TransferAction action = InitialFragmentDirections.transferAction();
    action.setLastName("Petrov");
    Navigation.findNavController(view).navigate(action);
} 

采纳答案by Alex

You calling twice to 'Navigation.findNavController(view).navigate':

您两次调用“Navigation.findNavController(view).navigate”:

def nav_version = "2.2.0"
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"

First time with bundle and second time with safe args, but after the first call your destination already changed to 'nextFragment', and when you call second 'navigate' the 'NavController' looking for 'transferAction' action inside 'nextFragment' and throws exception.

第一次使用捆绑包,第二次使用安全参数,但在第一次调用后,您的目的地已经更改为“nextFragment”,并且当您调用第二次“导航”时,“NavController”在“nextFragment”中寻找“transferAction”操作并抛出异常.

回答by Jagdish Suryawanshi

1.Add bellow Dependencies In gradle File

1.在gradle文件中添加波纹管依赖

    def nav_version = "2.2.0"
    classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"

2.Add Below Plugin in Your Project/Top Level Gradle

2.在您的项目/顶级Gradle中添加以下插件

##代码##

3.Rebuild Your project

3.重建你的项目