0

スタック オーバーフローさん、こんにちは。

問題

最初の (メイン) Android アクティビティを実行して画面の向きを変更すると、アプリは正常に動作し、向きを変更し続けることができ、引き続き機能します。

最初のアクティビティのボタンをクリックして 2 番目のアクティビティに移動すると、画面が変わり、すべてが正常に読み込まれ、上下にスクロールします (すべて問題ないようです)。

ただし、ここで (2 番目のアクティビティで) 方向を切り替えると、アクティビティはログ エラーなしで終了し、最初のアクティビティに戻ります。

私の質問は、画面の向きを切り替える機能を保持し、2 番目のアクティビティを閉じないようにするにはどうすればよいですか? 何が原因なのかわからない。画面の向きが変わるたびに、アクティビティを破棄して再作成する必要があることを読みました。しかし、最初のアクティビティに取り組んでいるのに、なぜ 2 番目のアクティビティに取り組んでいないのでしょうか?

最初のアクティビティ コードは次のとおりです。

    [Activity(Label = "FishinTales: Main Menu", MainLauncher = true, Icon = "@drawable/icon")]
public class Activity_View_MainMenu : Activity
{
    #region Components
    private Model n_model;
    private GridView n_mainMenuGridView;
    #endregion

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

        /*
            Load data using if statements. Load serializeable if no settings file.
            Or create new and test if it is accurately passing the custom class to another activity.
        */
        if (((MyApp) this.ApplicationContext).FishingData == null)
        {
            ((MyApp) this.ApplicationContext).LoadFishinTales();
            this.n_model = ((MyApp) this.ApplicationContext).FishingData;
        }
        else
        {
            this.n_model = ((MyApp) this.ApplicationContext).FishingData;
        }


        // Set our view from the "View_MainMenu" layout resource
        SetContentView(Resource.Layout.View_MainMenu);

        this.n_mainMenuGridView = FindViewById<GridView> (Resource.Id.xml_mainMenuGridView);
        this.n_mainMenuGridView.SetNumColumns(2);
        this.n_mainMenuGridView.Adapter = new MainMenuGridAdapter (this);

        this.n_mainMenuGridView.ItemClick += (o, e) => {
            if (e.Position == 0)
            {
                // Navigate to Fish Species
                Intent intent = new Intent(this, typeof(Activity_View_FishSpecies));
                this.StartActivityForResult(intent, RequestCodes.View_FishSpecies);
            }
            else if (e.Position == 1)
            {
                // Navigate to My Favorite Spots
                Toast.MakeText(this, "TODO: Navigate to My Favorite Sports", ToastLength.Long).Show();
                //Intent intent = new Intent(this, typeof(View_MyFavoriteSpots));
                //this.StartActivityForResult(intent, RequestCodes.View_MyFavoriteSpots);
            }
            else if (e.Position == 2)
            {
                // Navigate to My Season
                Toast.MakeText(this, "TODO: Navigate to My Season", ToastLength.Long).Show();
                //Intent intent = new Intent(this, typeof(View_MySeason));
                //this.StartActivityForResult(intent, RequestCodes.View_MySeason);
            }
            else if (e.Position == 3)
            {
                // Navigate to Inventory
                Toast.MakeText(this, "TODO: Navigate to Inventory", ToastLength.Long).Show();
                //Intent intent = new Intent(this, typeof(View_Inventory));
                //this.StartActivityForResult(intent, RequestCodes.View_Inventory);
            }
            else if (e.Position == 4)
            {
                // Navigate to Fishing News
                Toast.MakeText(this, "TODO: Navigate to Fishing News", ToastLength.Long).Show();
                //Intent intent = new Intent(this, typeof(View_FishingNews));
                //this.StartActivityForResult(intent, RequestCodes.View_FishingNews);
            }
            else if (e.Position == 5)
            {
                // Navigate to Settings
                Toast.MakeText(this, "TODO: Navigate to Settings", ToastLength.Long).Show();
                //Intent intent = new Intent(this, typeof(View_Settings));
                //this.StartActivityForResult(intent, RequestCodes.View_Settings);
            }
            else
            {
                // Invalid Response
                Toast.MakeText(this, "Invalid Menu Selection", ToastLength.Long).Show();
            }
        };
    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        // Possibly save data after activity result.?.
    }
}

そして、これが私の最初のアクティビティの画像です(向きを問題なく変更するもの):

最初のアクティビティ - メイン メニュー

2 番目のアクティビティ コードは次のとおりです。

    [Activity(Label = "FishinTales: Fish Species")]
public class Activity_View_FishSpecies : Activity
{
    #region Components
    private Model n_model;
    private ListView n_fishSpeciesListView;
    #endregion

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

        // Get Application Global Model
        this.n_model = ((MyApp) this.ApplicationContext).FishingData;

        // Set our view from the "View_FishSpecies" layout resource
        SetContentView(Resource.Layout.View_FishSpecies);

        this.n_fishSpeciesListView = FindViewById<ListView> (Resource.Id.xml_fishSpeciesListView);
        this.n_fishSpeciesListView.Adapter = new FishSpeciesListAdapter (this.ApplicationContext, this.n_model.SpecieManager.Species);
    }
}

そして、これが私の2番目のアクティビティの画像です(携帯電話を傾けて横向きに設定しようとすると閉じます):

2 番目のアクティビティ - 魚種リスト

なぜこれが起こっているのか、さらに良いことに、この場合の良い回避策は何ですか? 画面を特定の向きのままにしたくないことに注意してください。ユーザーが2つを閉じずに切り替えることができれば幸いです。読んでくれてありがとう。

4

2 に答える 2

0

2 番目のアクティビティの Mainfest xml にこれを追加します。

<activity android:name="com.package.SecondActivity" android:configChanges="keyboard|keyboardHidden|orientation" />
于 2012-12-08T16:01:44.780 に答える
0

私はあなたの問題を再現しようとしました.2番目のアクティビティは閉じられていませんが、電話を傾けると適切に回転します. もちろん、あなたのレイアウトや画像はありません。問題は投稿したコードではなく、別の場所にあるようです。ほとんどの場合、スペースの問題があります (画像を操作するときにメモリの問題にも直面しました)。これを確認するには、アダプターをコメントアウトするか、画像をロードするアダプター内のコードを試してください。私の場合、画像を小さく保つために画像をリサイズする必要がありました。また、アダプターのコードが役立つ場合があります。お役に立てれば。

于 2012-12-25T10:34:18.440 に答える