1

Xamarin.Android アプリが強制終了され、アプリケーションがメイン アクティビティを再作成する必要がある場合、一部のレイアウトが使用できず、画面にビューが表示されないことがあります。

デバイスの戻るボタンを押してからアプリケーションを再度開くと、そのメイン アクティビティが正しくインスタンス化されて表示されます。

これは、使用されたレイアウトのロードを担当するコードです。

// Returns null whenever trying to recreate views right after the application got killed by Android (Due to some multi-tasking reasons). Otherwise, it returns valid instances.
var layout = DroidResources.LoadLayout (context, parent, layoutName);

次のスクリーンショットを参照してください (テキストは省略されています)。

システムがアクティビティを自動的に再作成する前/後。

前 後

私は使っている:

  • Xamarin Android 4.10
  • MvvmCross 3.0.13 - Android.Dialog

この問題を解決するにはどうすればよいか教えてください。私は、説明されている両方のテクノロジーに不慣れです。どんな助けでも大歓迎です。


DDMS アプリケーションから取得したログ:

E/Android.Dialog(9171): LoadLayout failed: You must call DroidResources.Initialize(Resource.Layout) before using Dialogs
E/Android.Dialog(9171): LoadLayout failed: You must call DroidResources.Initialize(Resource.Layout) before using Dialogs
E/Android.Dialog(9171): LoadLayout failed: You must call DroidResources.Initialize(Resource.Layout) before using Dialogs
E/Android.Dialog(9171): LoadLayout failed: You must call DroidResources.Initialize(Resource.Layout) before using Dialogs
E/Android.Dialog(9171): LoadLayout failed: You must call DroidResources.Initialize(Resource.Layout) before using Dialogs
E/Android.Dialog(9171): LoadLayout failed: You must call DroidResources.Initialize(Resource.Layout) before using Dialogs
E/Android.Dialog(9171): ViewElement: Failed to load resource: MenuSeparator
E/Android.Dialog(9171): LoadLayout failed: You must call DroidResources.Initialize(Resource.Layout) before using Dialogs
E/Android.Dialog(9171): LoadLayout failed: You must call DroidResources.Initialize(Resource.Layout) before using Dialogs
E/Android.Dialog(9171): LoadLayout failed: You must call DroidResources.Initialize(Resource.Layout) before using Dialogs
E/Android.Dialog(9171): ViewElement: Failed to load resource: MenuSeparator

アプリケーションを正常に開くときに DroidResources クラスが初期化されたのに、アプリケーションがバックグラウンドから戻ったときに初期化されない理由を理解したいと思います。バックグラウンド時間中に、Android はアプリケーション全体ではなく、インスタンスのガベージ コレクションを強制したと思います。

また、間違って初期化している可能性があると思います。それが私のSetup.csファイルです。

/// <summary>
/// MvvmCross setup class.
/// Allows Android.Dialog usage during application lifecycle
/// </summary>
public class Setup : MvxAndroidDialogSetup 
{
    public Setup (Context applicationContext)
        : base (applicationContext)
    {
    }

    protected override IMvxApplication CreateApp ()
    {
        return new MvvmCrossApplication ();
    }
}


// MvvmCross internal application.
public class MvvmCrossApplication : MvxApplication
{
    public override void Initialize ()
    {
        // Setup initial application view which will be loaded as soon as the MvvmCross framework
        // initialization has been completed.
        RegisterAppStart<ApplicationViewModel>();
    }
}

//
// These next classes ApplicationViewModel and ApplicationView are auxiliary classes
// needed by the MvvmCross framework to ensure that others application classes are loaded
// only after the MvvmCross initilization has been completed.
public class ApplicationViewModel : MvxViewModel
{
}

[Activity (Theme = "@style/Theme.Transparent", NoHistory = true)]
public class ApplicationView : MvxActivity
{
    protected override void OnResume ()
    {
        base.OnResume ();

        // Start the application main activity.
        StartActivity (typeof(ApplicationMainActivity));
    }
}

今までは、MvvmCross ライブラリの Android.Dialog dll を使用していました。しかし、できるだけ早く ViewModel の使用を開始するつもりです。

ApplicationMainActivity ソース コードは次のとおりです。

/// <summary>
/// Application activity.
/// </summary>
/// <remarks>A transparent activity used to recreate current application screens workflow.</remarks>
[Activity (Theme = "@style/Theme.Transparent", NoHistory = true)]   
public class ApplicationMainActivity : ClientUserActivity
{
    #region Lifecycle methods

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        if (ClientUser.IsLoggedIn ()) {

            if (ClientUser.ShouldShowWizard ()) {

                    // Show the wizard screen
                    StartActivity (wizardActivity);

                } else {

                    // Show the main menu screen
                    StartActivity (typeof(NavigationDrawerActivity));
                }

        } else {
            // Show the welcome screen
            StartActivity (typeof(WelcomeActivity));
        }
    }
    ...
4

1 に答える 1

3

この質問にコードの層ごとに投稿すると、実際に MvvmCross を使用しているかどうかについてますます混乱しています。

MvvmCross Android.Dialog ポートを使用しているだけで、MvvmCross を使用していない場合は、エラー メッセージで求められていることを実行する方法を見つける必要があります。

    You must call DroidResources.Initialize(Resource.Layout) before using Dialogs

「通常の」MvvmCross アプリケーションでは、この問題は回避されていMvxActivityます。SetupOnCreateSetup

    protected virtual void InitializeDialogBinding()
    {
        var finder = Mvx.Resolve<IMvxAppResourceTypeFinder>();
        var resourceType = finder.Find();
        var nestedResourceType = resourceType.GetNestedTypes().FirstOrDefault(x => x.Name == "Layout");
        DroidResources.Initialize(nestedResourceType);
    }

https://github.com/MvvmCross/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Dialog.Droid/MvxAndroidDialogSetup.cs#L40を参照してください。

アクティビティを実装する場合non-MvxActivityは、セットアップを開始したり、droid リソースをロードしたりするために、別の方法を見つける必要があります。

于 2013-10-30T18:12:42.737 に答える