Xamarin.Forms.Android:java.lang.IllegalStateException:片段没有视图。

7

我正在开发一款Xamarin.Forms应用程序。它可以很好的运行,但是当用户在打开其他几个应用程序之后将其从后台带回来时,它总是崩溃。我对Xamarin不熟悉,也不确定如何调试此问题。目前为止,这个问题在iOS上没有发生。

SplashActivity.cs:

using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Support.V7.App;
using Android.Util;

namespace MyApp.Droid
{
    [Activity(Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true)]
    public class SplashActivity : AppCompatActivity
    {
        static readonly string TAG = "X:" + typeof(SplashActivity).Name;

        protected override void OnCreate(Bundle savedInstanceState) //  PersistableBundle persistentState
        {
            base.OnCreate(savedInstanceState); // persistentState
            Log.Debug(TAG, "SplashActivity.OnCreate");
        }

        protected override void OnResume()
        {
            base.OnResume();

            Task startupWork = new Task(() =>
                                        {
                                            Log.Debug(TAG, "Performing some startup work that takes a bit of time.");
                                            Task.Delay(5000); // Simulate a bit of startup work.
                                            Log.Debug(TAG, "Working in the background - important stuff.");
                                        });

            startupWork.ContinueWith(t =>
                                     {
                                         Log.Debug(TAG, "Work is finished - start Activity1.");
                                         StartActivity(new Intent(Application.Context, typeof(MainActivity)));
                                     }, TaskScheduler.FromCurrentSynchronizationContext());

            startupWork.Start();
        }
    }
}

MainActivity.cs:

using System;

using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

using HockeyApp.Android;
using HockeyApp.Android.Metrics;

using Xamarin.Android.Net; // Keep to make TLS 1.2 work

namespace MyApp.Droid
{
    [Activity(Label = "EventingVolunteers.Droid", Icon = "@drawable/icon", Theme = "@style/MyTheme", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

            LoadApplication(new App());

            // HockeyApp
            CrashManager.Register(this, Constants.HockeyAppID_Android);
            MetricsManager.Register(this, Application, Constants.HockeyAppID_Android);

            // Push Notifications
            RegisterForGCM();
        }

        private void RegisterForGCM()
        {
            string senders = Constants.GoogleConsoleProjectId;
            Intent intent = new Intent("com.google.android.c2dm.intent.REGISTER");
            intent.SetPackage("com.google.android.gsf");
            intent.PutExtra("app", PendingIntent.GetBroadcast(this, 0, new Intent(), 0));
            intent.PutExtra("sender", senders);
            StartService(intent);
        }

        protected override void OnPause()
        {
            base.OnPause();
        }

        protected override void OnResume()
        {
            base.OnResume();
        }

        protected override void OnDestroy()
        {
            base.OnDestroy();
        }
    }
}

错误信息:
java.lang.IllegalStateException: Fragment does not have a view
android.support.v4.app.Fragment$1.onFindViewById()Fragment.java:1933
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1057
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1252
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1234
android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated()FragmentManager.java:2046
android.support.v4.app.Fragment.performActivityCreated()Fragment.java:1989
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1092
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1252
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1234
android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated()FragmentManager.java:2046
android.support.v4.app.FragmentController.dispatchActivityCreated()FragmentController.java:174
android.support.v4.app.FragmentActivity.onStart()FragmentActivity.java:598
md5b60ffeb829f638581ab2bb9b1a7f4f3f.FormsAppCompatActivity.n_onStart(Native Method)
md5b60ffeb829f638581ab2bb9b1a7f4f3f.FormsAppCompatActivity.onStart()FormsAppCompatActivity.java:120
android.app.Instrumentation.callActivityOnStart()Instrumentation.java:1260
android.app.Activity.performStart()Activity.java:6261
android.app.ActivityThread.performLaunchActivity()ActivityThread.java:2389
android.app.ActivityThread.handleLaunchActivity()ActivityThread.java:2490
at android.app.ActivityThread.-wrap11(ActivityThread.java)
android.app.ActivityThread$H.handleMessage()ActivityThread.java:1354
android.os.Handler.dispatchMessage()Handler.java:102
android.os.Looper.loop()Looper.java:148
android.app.ActivityThread.main()ActivityThread.java:5456
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run()ZygoteInit.java:728
com.android.internal.os.ZygoteInit.main()ZygoteInit.java:618
Xamarin caused by: Java.Lang.IllegalStateException: Fragment does not have a view
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Java.Interop.JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod(JniObjectReference instance, JniObjectReference type, JniMethodInfo method, JniArgumentValue* args)
Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeVirtualVoidMethod(string encodedMember, IJavaPeerable self, JniArgumentValue* parameters)
Android.App.Activity.OnStart()
Xamarin.Forms.Platform.Android.FormsAppCompatActivity.OnStart()
Android.App.Activity.n_OnStart(IntPtr jnienv, IntPtr native__this)
at (wrapper dynamic-method) System.Object:23d8bc20-60cf-4cac-a339-6cc6722e8667 (intptr,intptr)
--- End of managed Java.Lang.IllegalStateException stack trace ---
java.lang.IllegalStateException: Fragment does not have a view
android.support.v4.app.Fragment$1.onFindViewById()Fragment.java:1933
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1057
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1252
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1234
android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated()FragmentManager.java:2046
android.support.v4.app.Fragment.performActivityCreated()Fragment.java:1989
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1092
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1252
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1234
android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated()FragmentManager.java:2046
android.support.v4.app.FragmentController.dispatchActivityCreated()FragmentController.java:174
android.support.v4.app.FragmentActivity.onStart()FragmentActivity.java:598
md5b60ffeb829f638581ab2bb9b1a7f4f3f.FormsAppCompatActivity.n_onStart(Native Method)
md5b60ffeb829f638581ab2bb9b1a7f4f3f.FormsAppCompatActivity.onStart()FormsAppCompatActivity.java:120
android.app.Instrumentation.callActivityOnStart()Instrumentation.java:1260
android.app.Activity.performStart()Activity.java:6261
android.app.ActivityThread.performLaunchActivity()ActivityThread.java:2389
android.app.ActivityThread.handleLaunchActivity()ActivityThread.java:2490
at android.app.ActivityThread.-wrap11(ActivityThread.java)
android.app.ActivityThread$H.handleMessage()ActivityThread.java:1354
android.os.Handler.dispatchMessage()Handler.java:102
android.os.Looper.loop()Looper.java:148
android.app.ActivityThread.main()ActivityThread.java:5456
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run()ZygoteInit.java:728
com.android.internal.os.ZygoteInit.main()ZygoteInit.java:618
--- End of managed Java.Lang.IllegalStateException stack trace ---
java.lang.IllegalStateException: Fragment does not have a view
android.support.v4.app.Fragment$1.onFindViewById()Fragment.java:1933
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1057
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1252
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1234
android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated()FragmentManager.java:2046
android.support.v4.app.Fragment.performActivityCreated()Fragment.java:1989
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1092
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1252
android.support.v4.app.FragmentManagerImpl.moveToState()FragmentManager.java:1234
android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated()FragmentManager.java:2046
android.support.v4.app.FragmentController.dispatchActivityCreated()FragmentController.java:174
android.support.v4.app.FragmentActivity.onStart()FragmentActivity.java:598
md5b60ffeb829f638581ab2bb9b1a7f4f3f.FormsAppCompatActivity.n_onStart(Native Method)
md5b60ffeb829f638581ab2bb9b1a7f4f3f.FormsAppCompatActivity.onStart()FormsAppCompatActivity.java:120
android.app.Instrumentation.callActivityOnStart()Instrumentation.java:1260
android.app.Activity.performStart()Activity.java:6261
android.app.ActivityThread.performLaunchActivity()ActivityThread.java:2389
android.app.ActivityThread.handleLaunchActivity()ActivityThread.java:2490
at android.app.ActivityThread.-wrap11(ActivityThread.java)
android.app.ActivityThread$H.handleMessage()ActivityThread.java:1354
android.os.Handler.dispatchMessage()Handler.java:102
android.os.Looper.loop()Looper.java:148
android.app.ActivityThread.main()ActivityThread.java:5456
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run()ZygoteInit.java:728
com.android.internal.os.ZygoteInit.main()ZygoteInit.java:618

App.xaml.cs:

using System;
using System.Linq;
using Amazon;
using Xamarin.Forms;

namespace MyApp
{
    public partial class App : Application
    {
        public static string AppName { get { return "MyApp"; } }

        public static User User { get; set; }

        public static UserManager UserManager { get; private set; }

        public static VolunteerManager VolunteerManager { get; private set; }

        public static SignupManager SignupManager { get; private set; }

        static NavigationPage NavPage;

        public static bool IsLoggedIn
        {
            get
            {
                if (User != null)
                    return !string.IsNullOrWhiteSpace(User.Email);
                else
                    return false;
            }
        }

        public static Action SuccessfulLoginAction
        {
            get
            {
                return new Action(() =>
                {
                    NavPage.Navigation.PopModalAsync();

                    if (IsLoggedIn)
                    {
                        // Update RestService with new token
                        UserManager = new UserManager(new RestService());
                        VolunteerManager = new VolunteerManager(new RestService());
                        SignupManager = new SignupManager(new RestService());

                        NavPage.Navigation.InsertPageBefore(new VolunteerDashboardPage(), NavPage.Navigation.NavigationStack.First());
                        NavPage.Navigation.PopToRootAsync();
                    }
                });
            }
        }

        public static Action LogoutAction
        {
            get
            {
                return new Action(() =>
                {
                    DependencyService.Get<ICredentialsService>().DeleteCredentials();
                    App.User = null;
                    // NavPage.Navigation.PopModalAsync();
                    NavPage.Navigation.InsertPageBefore(new LoginPage(), NavPage.Navigation.NavigationStack.First());
                    NavPage.Navigation.PopToRootAsync();
                });
            }
        }

        public App()
        {
            User = new User();
            UserManager = new UserManager(new RestService());
            VolunteerManager = new VolunteerManager(new RestService());
            SignupManager = new SignupManager(new RestService());

            // AWS SDK
            var loggingConfig = AWSConfigs.LoggingConfig;
            loggingConfig.LogMetrics = true;
            loggingConfig.LogResponses = ResponseLoggingOption.Always;
            loggingConfig.LogMetricsFormat = LogMetricsFormatOption.JSON;
            loggingConfig.LogTo = LoggingOptions.SystemDiagnostics;

            //AWSConfigs.AWSRegion = "us-east-1";

            // Check if login needed
            if (DependencyService.Get<ICredentialsService>().DoCredentialsExist())
            {
                NavPage = new NavigationPage(new VolunteerDashboardPage());
                MainPage = NavPage;
                // MainPage = new VolunteerDashboardPage();
            } else {
                NavPage = new NavigationPage(new LoginPage());
                MainPage = NavPage;
            }
        }

        protected override void OnStart()
        {
            // Handle when your app starts
        }

        protected override void OnSleep()
        {
            // Handle when your app sleeps
        }

        protected override void OnResume()
        {
            // Handle when your app resumes
        }
    }
}

没有启动画面,它能正常工作吗? - Ahmad ElMadi
当我删除SplashActivity.cs并将MainActivity.cs的“MainLauncher = true”时,出现相同的问题。 - fnllc
至少我们现在知道这与启动画面无关,它表明崩溃发生在Android.App.Activity.OnStart()方法的某个地方。 你的Xamarin.Forms中相应的应用程序类是什么样子的? - Ahmad ElMadi
如果你在OnStart()和OnResume()处设置断点并执行相同的场景,哪一个会被触发?情况应该是只有Resume会被触发。但从跟踪中可以看到,是OnStart触发了。问题可能是如果两者都被触发,则可能有两个相同的实例。 - Ahmad ElMadi
1
Xamarin.Forms的预发布版本列出了一个带有此错误消息的错误报告。(https://www.nuget.org/packages/Xamarin.Forms/2.3.2.118-pre1)。然而,bugzilla不会让你看到详细信息: https://bugzilla.xamarin.com/show_bug.cgi?id=42075。 - fnllc
显示剩余3条评论
3个回答

1
添加nuget包AndroidX.Fragment版本"1.2.5.4"对我有用。 只有在选择开发人员选项 -> 不保留活动时才能重现。

0

我曾经遇到过类似的问题。我使用Xamarin Forms 2.3.1.114创建了一个Android应用程序,使用了Master-Detail页面。在恢复应用程序后,我遇到了以下错误:

java.lang.IllegalStateException: Fragment does not have a view

我尝试了Xamarin Forms 2.3.2.118-pre1,它修复了这个错误(42075),但是增加了新的错误(因为它是预发布包)。我安装了Xamarin Forms 2.3.0.107(降级),这对我很有效。希望这能帮到你。


1
我遇到了同样的错误,我正在使用Xamarin Forms 2.3.1.114。你知道根本原因吗? - Krishna
尝试使用Xamarin Forms 2.3.0.107(降级版本)。希望这能有所帮助。 - FetFrumos
我也遇到了同样的错误,2.3.2.127稳定版修复了这个问题吗?谢谢 - Patrick Goode
我还没有测试新版本。我意识到需要非常谨慎地更新。我现在使用的是2.3.0.107。 - FetFrumos

0

这个问题已经超过5年了,但在2022年的Xamarin.Forms 5.x中,以稍微不同的设置仍然存在这个问题。

我在最近推送到商店的生产应用程序中遇到了这个问题。在现实世界中手动复制这个问题是相当困难的,但将应用程序发送到后台并执行以下操作:

adb shell "am kill <package-name>"

...然后从启动器中点击应用程序会立即导致崩溃。

我的应用程序引用Xamarin.AndroidX.Biometric版本1.1.0.6(截至2022年3月最新),这会拉取Xamarin.AndroidX.Fragment版本1.3.6.3Xamarin.AndroidX.Activity 1.3.1.2作为传递依赖项。

根据开放问题的评论,通过手动安装Xamarin.AndroidX.Fragment版本1.2.54Xamarin.AndroidX.Activity 1.2.2来降级这两个NuGet可以解决此问题。https://github.com/xamarin/Xamarin.Forms/issues/14193

“解决方案”远非理想,因此请关注链接的GitHub问题,以获取未来的更多更新。

希望这能帮助那些拥有类似设置的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接