- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我以两种不同的方式在 fragment 之间提供数据传输,第一种是正常工作,而安全数据类型会导致运行时崩溃。我正在使用那个 Android 文档: https://developer.android.com/topic/libraries/architecture/navigation/navigation-implementing#Safe-args
不明白我该如何解决这个问题。感谢您的帮助
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$0(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)
导航图:
<?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>
Activity 布局:
<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>
发件人:
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);
}
}
接收者:
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);
}
}
补充:
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"
}
最佳答案
您两次调用“Navigation.findNavController(view).navigate”:
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);
}
第一次使用 bundle,第二次使用 safe args,但是在第一次调用之后,您的目的地已经更改为“nextFragment”,当您调用第二次“导航”“NavController”时,在“nextFragment”中寻找“transferAction”操作并抛出异常。
关于java - 此 NavController 不知道操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51325285/
我正在编写一个 iPhone 应用程序,但我遇到了一个关于如何管理 View 呈现的问题。事实上,当用户启动应用程序时,会出现一个包含搜索表单的“主页” View 。当用户按下“搜索”按钮时,我想要一
我正在尝试从 VC 转换为嵌入在导航 Controller 中的 VC。 就我的目的而言,这两行代码似乎完成了同一件事,但我想知道它们之间的真正区别是什么以及一个是否对另一个有利。 为此... if
我基本上是在等待 5 秒后尝试导航到其他 fragment 。当我在 onViewCreated 中执行导航过程时,它可以工作,但是当我在 onFinish 中执行时,它给了我下面的错误。 我试图将
我在我的应用程序中使用导航组件,最近它工作正常但是在将项目更新到 AndroidX 之后我收到错误消息 navigation destination DESTINATION_NAME is unkno
我不确定我在这里做错了什么。简单的设置,带有由内部底部栏控制的 fragment 的单个 Activity ,到目前为止一切都很好。开始 fragment 有一个按钮,里面应该导航到另一个 fragm
我正在制作应用程序,它支持不同的设备方向。导航由 Android Jetpack 的 Navigation 进行。横向应用程序主屏幕如下所示。它是列表包装 fragment (它是 NavHostFr
我正在使用新的 android Storyboard来创建应用程序。流程需要如下所示: SplashFragment -> Fragment1 -> Fragment2 以下是 Storyboard(
我正在实现 Espresso 测试。我正在使用带有 NavGraph 范围 ViewModel 的 fragment 。问题是,当我尝试测试 Fragment 时,我得到了一个 IllegalStat
我想将导航 Controller 栏按钮项设置为图像。 我已阅读以下内容 - Add image to a navigationItem's title 我了解如何将其设置为图像。我实际上希望将其设置
我想实现 addOnDestinationChangedListener,但是没有成功。我已经尝试自己实现它,但是 ID 不匹配 NavController mController = Navigat
我基本上为底部导航 View 设置了 3 个 fragment ,所有 fragment 都链接到 activity.xml activity.xml 我放 fragment 标签的地方。 我的 A
试图效仿https://developer.android.com/guide/navigation/navigation-testing ,我有一个预期的错误 org.mockito.excepti
我目前在我的项目中使用 Android 导航架构。它具有可以使用快捷方式启动任何 fragment 的功能。目前我正在使用 NavController 在单击快捷方式时导航到所需的目的地。 但是当我多
我正在寻找的是我的 fragment 是否已经在后堆栈中。 例如,我导航到 Fragment A 到 Fragment B。稍后,我导航到 Fragment B 到 Fragment C。现在,我想
我正在使用导航组件在我的应用程序中导航。它在 fragment 内工作正常,但无法在包含实际导航主机的 Activity 中找到导航主机。 当用户单击 FAB 时,我试图打开一个新 fragment
我在处理多个 NavHost 时遇到问题。这个问题和问的 here 非常相似。 .我认为这个问题的解决方案也会对我有所帮助,但这是 2017 年的帖子,仍然没有答案。 Android 开发者文档没有帮
我在移动应用程序中使用 NavController,其中有一个 fragment ,其中有两个到另一个 fragment 的导航选项。我已在 mobile_navigation.xml 中创建了这两个
我以两种不同的方式在 fragment 之间提供数据传输,第一种是正常工作,而安全数据类型会导致运行时崩溃。我正在使用那个 Android 文档: https://developer.android.
我创建了 AuthHttpProvider,它是一个 Http 包装器,它允许发送 GET/POST/PUT/DELETE 请求并自动向每个请求添加身份验证 token (jwt)。我在我所有的 io
我从侧边菜单启动器启动了一个 ionic 2 应用程序。现在我想将生成的代码移动到应用程序组件(菜单)到一个文件夹中,然后编写一个主组件。当我运行该应用程序时,它向我显示此错误: 原始异常(excep
我是一名优秀的程序员,十分优秀!