我尝试包含一个DialogFragment作为目的地,按照这里的例子,修改Xamarin的代码。
只要我在navgraph中使用<fragment/>
,代码就能正常工作。但是,当我尝试导航到DialogFragment时,更改为<dialog/>
后,应用程序崩溃,并显示错误消息:AndroidX.片段.应用程序.片段+示例化异常:'无法示例化片段fragmentname:请确保类名存在。
Is this functionality not available in xamarin.android, or are there any additional steps I need to take to make it work?
编辑1:过帐示例代码。
MainActivity.cs:
namespace exampleApp
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
SetContentView(Resource.Layout.activity_main);
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
活动主文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/main_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
fragment1.cs:
using Android.OS;
using Android.Views;
using Android.Widget;
using System;
using AndroidX.Fragment.App;
using AndroidX.Navigation;
namespace exampleApp
{
public class Fragment1 : Fragment
{
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//Inflating view pretty much creates it in memory, without showing it on screen.
View view = inflater.Inflate(Resource.Layout.fragment1_layout, container, false);
return view;
}
public override void OnViewCreated(View view, Bundle savedInstanceState)
{
base.OnViewCreated(view, savedInstanceState);
Button dialogButton = view.FindViewById<Button>(Resource.Id.button_dialog);
dialogButton.Click += (object sender, EventArgs e) =>
{
Navigation.FindNavController(view).Navigate(Resource.Id.dest_dialog);
};
}
}
}
片段1_布局. xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragment1_layout">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open Dialog"
android:id="@+id/button_dialog"/>
</LinearLayout>
ExampleDialog.cs:
namespace exampleApp
{
public class ExampleDialog : AndroidX.Fragment.App.DialogFragment
{
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your fragment here
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Use this to return your custom view for this Fragment
return inflater.Inflate(Resource.Layout.exampleDialog_layout, container, false);
//return base.OnCreateView(inflater, container, savedInstanceState);
}
}
}
示例对话框布局. xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/exampleDialog_layout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="EXAMPLE DIALOG"/>
</LinearLayout>
导航图. 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/nav_graph"
app:startDestination="@+id/dest_fragment1">
<fragment
android:id="@+id/dest_fragment1"
android:name="exampleApp.Fragment1">
</fragment>
<dialog
android:id="@+id/dest_dialog"
android:name="exampleApp.ExampleDialog">
</dialog>
</navigation>
2条答案
按热度按时间k3bvogb11#
@kfjpkcw
我试着重现你的问题,并且成功了。由于某些原因,xamarin.android似乎无法区分对话框和片段,因此出现了异常。我想你应该在https://github.com/xamarin/AndroidX/issues报告这个问题。我确信我很久以前就试过一个对话框,它工作正常。(https://medium.com/androiddevelopers/navigation-component-dialog-destinations-bfeb8b022759,但也许我只在Android Studio中使用过),但在使用了一段时间的nav_graphs后,我发现添加所有额外的东西都很乏味,比如要转到的目的地和动画(然后坚持一种类型的动画),所以决定只对片段部分使用nav_graph。如果你读了我的docx文件,我可以解释为什么我走自己的路。
要解决对话框的问题,只需按照我在NavigationGraph系列中提到的方法处理即可。
flvlnr442#
很高兴看到另一个Xamarin。Android开发人员使用NavigationComponent!!
这个错误通常是因为你在你的nav_graph. xml中有一个打字错误。你通常使用片段或对话框的完全限定名-大小写很重要。我总是小写命名空间,如com.companyname.navigationgraph6.fragments.RaceResultFragment。RaceResultFragment(片段名)和它在类中声明的完全一样。
我有很多关于NavigationComponent的教程,NavigationGraph 1到NavigationGraph 6,随着项目数量的增加,这些教程的复杂性也会增加。每个项目都有相同的NavigationGraph.docx,在我学习教程的过程中解释每个特性。
您可以在https://github.com/gmck找到它们。根据记忆,我认为这是NavigationGraph 3,我在其中引入了一个对话框。