在Xamarin中使用DialogFragment作为Navgraph目的地

tvz2xvvm  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(162)

我尝试包含一个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>
k3bvogb1

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系列中提到的方法处理即可。

flvlnr44

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,我在其中引入了一个对话框。

相关问题