簡體   English   中英

Xamarin.Forms.Android:java.lang.IllegalStateException:片段沒有視圖

[英]Xamarin.Forms.Android: java.lang.IllegalStateException: Fragment does not have a view

我正在開發一個 Xamarin.Forms 應用程序。 它運行良好,但當用戶在打開其他幾個應用程序后將其從后台恢復時,它會繼續崩潰。 我是 Xamarin 的新手,我不確定如何調試此問題。 到目前為止,此問題未在 iOS 上發生。

飛濺活動.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();
        }
    }
}

主要活動.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

應用程序.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
        }
    }
}

我有類似的問題。 我使用Xamarin Forms 2.3.1.114創建了應用程序(Android)。 我使用Master-Detail頁面。 恢復應用程序后,我收到此錯誤:

java.lang.IllegalStateException:Fragment沒有視圖

我試過Xamarin Forms 2.3.2.118-pre1。 它修復了這個錯誤(42075),但添加了新的錯誤(它是預包裝)。 我安裝了Xamarin Forms 2.3.0.107(降級)。 這對我有用。 希望對您有所幫助。

添加 nuget package AndroidX.Fragment 版本“1.2.5.4”對我有用。 僅當我 select 開發人員選項時才能重現 -> 不要保留活動

這個問題已經有 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降級這兩個 nugets 根據對未解決問題的評論解決了這個問題: https://github.com/xamarin/Xamarin.Forms/issues/ 14193

“解決方案”遠非理想,因此請關注鏈接的 github 問題,了解未來的更多更新。

希望這可以幫助具有類似設置的人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM