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));
}
}
...