3

1 つのアプリケーションを用意しました。私のアプリケーションは、横向きと縦向きの両方をサポートします。向きを縦向きから横向きに変更すると正常に動作しますが、横向きを縦向きに変更すると動作しません.私のコードは、

  public void onConfigurationChanged(Configuration newConfig) {

        super.onConfigurationChanged(newConfig);
        System.out.println("orientation---"+getResources().getConfiguration().orientation);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            setContentView(R.layout.main);
            System.out.println("landscape-----");
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            setContentView(R.layout.main);
            System.out.println("portrait-----");
        }

    }

毎回ランドスケープモードしか取っていません。どこかでミスをしました。助けてください。

System.out.println("orientation---"+getResources().getConfiguration().orientation);

上記の SOP は 2 を意味するランドスケープを印刷しています。助けてください。(私は 2.3.3 を使用しています)

4

3 に答える 3

2

このバグに遭遇している可能性があります

45 人以上が androidd 2.3 エミュレータで同じ問題に直面しています

http://code.google.com/p/android/issues/detail?id=13189

ホスト OS: Windows 7 SDK ツール バージョン: リビジョン 8 Eclipse バージョン: 3.5 ADT プラグイン バージョン: 8.0.1 プロジェクトの対象プラットフォーム: 2.3 エミュレーターで実行されているプラ​​ットフォームのバージョン:2.3

再現手順: 1. アクティビティ 1 (画面の向きなし) - アクティビティ 2 (画面の向き = 横向き)

  1. アクティビティ 1 から 2 への移行は正常に機能します。戻ると、アクティビティ 1 の向きが横向きに変わります

期待される結果:アクティビティ 1 は縦向きモードにする必要があります。

観測結果:動作はジンジャーブレッドでのみ観測され、froyo では期待どおりに動作します。

于 2012-03-05T12:09:00.623 に答える
2

問題は、android:configChanges="orientation|keyboardHidden".

androidmanifest.xml から削除する|keyboardHiddenと、onConfigurationChanged は、縦から横に移動したときではなく、横から縦に回転したときにのみ発生します (少なくともデフォルトのエミュレータでは)。

お役に立てれば。

編集:それをテストするためにいくつかのサンプルプログラムを作成しましたが、私にとってはうまく機能します。

CheckOrientationActivity.java

import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class CheckOrientationActivity extends Activity {


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Log.i("DayElevenActivity", "onCreate Start");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i("DayElevenActivity", "onConfigurationChanged");
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Log.i("ORIENTATION_LANDSCAPE", "ORIENTATION_LANDSCAPE");
            Toast.makeText(getBaseContext(), "ORIENTATION_LANDSCAPE", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            Log.i("ORIENTATION_PORTRAIT", "ORIENTATION_PORTRAIT");
            Toast.makeText(getBaseContext(), "ORIENTATION_PORTRAIT", Toast.LENGTH_SHORT).show();
        }
    }

}

AndroidManifest.xml

<activity
            android:label="@string/app_name"   
            android:configChanges="**orientation|keyboardHidden**"    
            android:name=".CheckOrientationActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

実行して向きを変更したときの対応するログ

03-05 18:54:31.644: I/CheckOrientationActivity (20314): onCreate Start
03-05 18:54:35.014: I/CheckOrientationActivity (20314): onConfigurationChanged
03-05 18:54:35.014: I/ORIENTATION_LANDSCAPE(20314): ORIENTATION_LANDSCAPE
03-05 18:54:41.984: I/CheckOrientationActivity (20314): onConfigurationChanged
03-05 18:54:41.984: I/ORIENTATION_PORTRAIT(20314): ORIENTATION_PORTRAIT
于 2012-03-05T12:35:46.167 に答える
1

これが発生する理由は複数ありますが、コードを追加しないとわかりません。

ここにいくつかのポインタがあります:

  • マニフェストファイルまたはプログラム(<activity android:screenOrientation="portrait">マニフェストのようなもの)を介して、レイアウトを特定の方向に強制していません

  • デフォルトでは、構成が変更されたときにアクティビティが再開されます。向きが変わったときにアクティビティを再開したくない場合は、次を使用する必要があります。

    android:configChanges = "orientation"

マニフェストでのアクティビティの構成について。

  • 上記の点は、実際onConfigurationChanged(Configuration)には、向きが変わったときにAndroidがアクティビティのメソッドを呼び出すようにします

==更新==

また、layout-landとlayout-portで同じレイアウト(「main」など)を宣言している場合は、最初にそのレイアウトを使用することを指定するだけで済みます。

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

以上です。を実装する必要もありません

public void onConfigurationChanged(Configuration newConfig) {
  //...
}

メソッドも。向きに基づいて正しいレイアウトを選択するために必要なのは、これら2つのフォルダーで同じレイアウトを宣言することだけです。

(また、マニフェストにを追加する必要はありませ android:configChanges="orientation"ん。明らかにデフォルトでオンになっています)。私は今これをすべて試しました、うまくいきます

于 2012-03-05T12:12:44.600 に答える