如何解决如何使用SafeArgs导航
我刚刚开始使用Jetpack导航组件和SafeArgs在Android中进行导航。但是,我不明白如何从一个目的地导航到另一个目的地(我阅读了google文档,但这对我来说很混乱)。因此,我有一个Menu_Fragment类,该类在NavGraph中具有指向Softdrink类的链接。 Menu_FragmentDirections类是自动创建的。但是,我不知道如何在Menu_Fragment类中使用它来实现OnClick侦听器事件。这里,我在Menu_Fragment类中具有onClick方法(请参见https://developer.android.com/guide/navigation/navigation-navigate):
@Override
public void onClick(View view) {
if(view.getId() == R.id.imageButton_Softdrinks_en) {
float amount = ...;
action =
Menu_FragmentDirections
.actionMenuFragmentToSoftdrinks(amount);
Navigation.findNavController(view).navigate(action);
}
}
在这里您可以看到Menu_FragmentDirections类:
package com.example.td.barapp;
import androidx.annotation.NonNull;
import androidx.navigation.ActionOnlyNavDirections;
import androidx.navigation.NavDirections;
public class Menu_FragmentDirections {
private Menu_FragmentDirections() {
}
@NonNull
public static NavDirections actionMenuFragmentToSoftdrinks() {
return new ActionOnlyNavDirections(R.id.action_menu_Fragment_to_softdrinks);
}
}
在这里您可以看到NavGraph:
<?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/menu_Fragment">
<fragment
android:id="@+id/menu_Fragment"
android:name="com.example.td.barapp.Menu_Fragment"
android:label="fragment_menu_"
tools:layout="@layout/fragment_menu" >
<action
android:id="@+id/action_menu_Fragment_to_softdrinks"
app:destination="@id/softdrinks" />
</fragment>
<fragment
android:id="@+id/softdrinks"
android:name="com.example.td.barapp.Softdrinks"
android:label="fragment_softdrinks"
tools:layout="@layout/fragment_softdrinks" />
</navigation>
任何人都可以告诉我,我在上面发布的onCreateMethod()中必须做什么。我收到错误消息: “无法解析符号“动作””和“无法解析符号“导航””(当然还有使用意外标记“ ...”的错误)
我会很感激每条评论,非常感谢您的帮助。
这里更新的是带有onCreateMethod的完整Menu_Fragment类:
package com.example.td.barapp;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.example.td.barapp.databinding.FragmentMenuBinding;
/**
* A simple {@link Fragment} subclass.
* Use the {@link Menu_Fragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class Menu_Fragment extends Fragment implements View.OnClickListener {
// TODO: Rename parameter arguments,choose names that match
// the fragment initialization parameters,e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private Menu_Fragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment Menu_Fragment.
*/
// TODO: Rename and change types and number of parameters
public static Menu_Fragment newInstance(String param1,String param2) {
Menu_Fragment fragment = new Menu_Fragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1,param1);
args.putString(ARG_PARAM2,param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
private FragmentMenuBinding binding;
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
binding = FragmentMenuBinding.inflate(inflater,container,false);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {
super.onViewCreated(view,savedInstanceState);
binding.imageButtonCocktailsEn.setOnClickListener(this);
binding.imageButtonCocktailsAlcfreeEn.setOnClickListener(this);
binding.imageButtonLongdrinksEn.setOnClickListener(this);
binding.imageButtonWhiskyEn.setOnClickListener(this);
binding.imageButtonLiquorEn.setOnClickListener(this);
binding.imageButtonBeerEn.setOnClickListener(this);
binding.imageButtonSoftdrinksEn.setOnClickListener(this);
binding.imageButtonHotDrinksEn.setOnClickListener(this);
}
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
@Override
public void onClick(View view) {
if(view.getId() == R.id.imageButton_Softdrinks_en) {
float amount = 0f;
Menu_FragmentDirections.ActionMenuFragmentToSoftdrinks action = Menu_FragmentDirections
.actionMenuFragmentToSoftdrinks(amount);
}
}
}
解决方法
在操作之前您缺少对象类型。
它是这样的:
Menu_FragmentDirections.ActionMenuFragmentToSoftdrinks action = Menu_FragmentDirections
.actionMenuFragmentToSoftdrinks(amount);
错误:
错误:表达式开始的非法浮点量= ...;
这是因为您想要一个浮点,并且正在传递“ ...”。它必须是一个浮点数。
即:float amount = 0.6f
或float amount = 0f
。
编辑:
要将参数添加到片段,请执行以下步骤:
重建您的项目,并检查它是否正在运行。
希望有帮助。
,任何人都可以告诉我,我在上面发布的onCreateMethod()中需要做什么。我收到错误消息:“无法解析符号'action'”和“无法解析符号'Navigation'”(当然还有错误使用意外令牌'...')
这就是我的想法,您的 navGraph.xml 中存在问题,您打算将SafeArg从MenuFragment
传递到SoftDrinksFragment
,但您没有在编写代码进行这项工作,这就是为什么您的action
无法解决的原因。
按如下所示编辑navGraph.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/nav_graph"
app:startDestination="@id/menu_Fragment">
<fragment
android:id="@+id/menu_Fragment"
android:name="com.example.td.barapp.Menu_Fragment"
android:label="fragment_menu_"
tools:layout="@layout/fragment_menu" >
<action
android:id="@+id/action_menu_Fragment_to_softdrinks"
app:destination="@id/softdrinks" />
</fragment>
<fragment
android:id="@+id/softdrinks"
android:name="com.example.td.barapp.Softdrinks"
android:label="fragment_softdrinks"
tools:layout="@layout/fragment_softdrinks">
<argument
android:name="amount"
app:argType="integer" />
</fragment>
</navigation>
还可以解决Navigation
的问题
确保将此依赖项添加到gradle文件中
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$2.3.0"
将此行添加到gradle文件的顶部:
apply plugin: "androidx.navigation.safeargs"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。