1

私はかなり長い間探してきましたが、まだ運がありません。コードを現在編集されているバージョンに変更します。 EDITED アプリケーションでは、onCreate で次のように開始します。

    @Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.game_activity);
    . . . . . 

アプリはまだ問題なく動作します。onConfigurationChange() で setContentView() を削除したので、スイッチは実際には何もしません:

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
switch(newConfig.orientation)
{
case Configuration.ORIENTATION_PORTRAIT:
    break;
case Configuration.ORIENTATION_LANDSCAPE:
        break;
}
}   //  onConfigurationChanged()  

空白の画面がなくなったので、安心です。
しかし; アプリを P モードで起動し、構成を L モードに変更すると、レイアウトは P モードと同じままになり、その逆も同様です。

ふと気がついた!活動は一度だけ開始されます!それはまさに私が望んでいることですが、コードが一度しか実行されないことも意味します。まずそれを確認しなければなりません。

編集

OK、必要なものをすべてチェックアウトしました。しかし、問題は残ります。

縦向きモードでアプリを起動すると、すべて問題ありません。しかし、横向きモードに変更すると、構成の変更が実行され、縦向きレイアウトのみが使用され、その逆も同様です。

私は、xml のさまざまな方向に対してさまざまなレイアウトを持っています。私も持っています

 android:configChanges="orientation|screenSize" >

マニフェストで。

私には選択肢がありません。どんな助けでも大歓迎です。

もう一度編集

証明するのは難しかったが、私は成功した。これは、縦向きモード用の XML と横向きモード用の XML です。

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/portGame480x800"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:tag="layout_game_activity"
tools:context=".MeMoInfoActivity" >
.....
</LinearLayout



<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/landGame480x800"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:baselineAligned="false"
android:tag="layout-land_game_activity"
tools:context=".MeMoInfoActivity" >
....
</LinearLayout>

これはコードです:

public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);

Log.i(TAG, "***************************\nMeMoGameActivity onConfigurationChanged\n***************************"); 

switch(newConfig.orientation)
{
case Configuration.ORIENTATION_PORTRAIT:
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        LinearLayout portLayout = (LinearLayout) findViewById(R.id.portGame480x800);
        if(portLayout != null)
        {
            String portTag = (String) portLayout.getTag().toString();
            Log.i(TAG, "Portrait portTag: "+portTag);
        }
break;
case Configuration.ORIENTATION_LANDSCAPE:
        Toast.makeText(this, "Landscape", Toast.LENGTH_SHORT).show();
        LinearLayout landLayout = (LinearLayout) findViewById(R.id.landGame480x800);
        if(landLayout != null)
        {
            String landTag = (String) landLayout.getTag().toString();

            Log.i(TAG, "LansScape landTag: "+landTag);
        }
        break;
}
}   //  onConfigurationChanged()   

これは logcat からの出力です。

09-30 17:10:32.376: I/MeMoGame(2509): ***************************
09-30 17:10:32.376: I/MeMoGame(2509): MeMoGameActivity onConfigurationChanged
09-30 17:10:32.376: I/MeMoGame(2509): ***************************

09-30 17:10:32.534: I/MeMoGame(2509): LANDSCAPE InfoActivity dispWidthPX: 800


09-30 17:11:02.234: I/MeMoGame(2509): ***************************
09-30 17:11:02.234: I/MeMoGame(2509): MeMoGameActivity onConfigurationChanged
09-30 17:11:02.234: I/MeMoGame(2509): ***************************

09-30 17:11:02.384: I/MeMoGame(2509): Portrait portTag: layout_game_activity

09-30 17:11:02.384: I/MeMoGame(2509): PORTRAIT InfoActivity dispWidthPX: 480

09-30 17:11:02.896: D/dalvikvm(2509): GC_CONCURRENT freed 102K, 3% free 6320K/6471K, paused 19ms+7ms, total 320ms

アプリは縦向きモードで起動されました。ランドスケープレイアウトを実行したことがないことは明らかです。

誰か助けてくれませんか?

4

1 に答える 1

3

現在の構成に基づいて、どのレイアウトを使用するかを Android フレームワークに決定させる必要があります。したがって、2 つのフォルダーを作成しlayout-landlayout-portレイアウトを置きます (同じファイル名を使用することが重要です)。また、コード内のそのスイッチを削除します。

于 2013-09-27T20:26:19.777 に答える