web-dev-qa-db-ja.com

android画面の向き

getOrientation()で方向の値を取得しようとしましたが、常に0が返されます!

20
Sivaganesan.r

getOrientation()は非推奨ですが、これが必ずしも問題の原因ではありません。 getOrientation()の代わりにgetRotation()を使用する必要があるのは事実ですが、ターゲットにする場合にのみ使用できますAndroid 2.2 (APIレベル8)以上。一部の人々やGoogle社員でさえ、それを忘れているようです。

例として、Android 2.2。getOrientation()およびgetRotation()を実行しているHTCの欲求で、両方とも同じ値を報告します。

  • 0(デフォルト、ポートレート)、
  • 1(デバイスは反時計回りに90度)、
  • 3 (device 90 degree clockwise)

「頭の上」に置いても報告されません(180回転すると、値2になります)。この結果はデバイス固有である可能性があります。

まず、エミュレーターを使用するかデバイスを使用するかを明確にする必要があります。エミュレータを回転させる方法を知っていますか?次に、次のようなonCreate()メソッドを使用して小さなテストプログラムを作成することをお勧めします。

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

    WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    Display mDisplay = mWindowManager.getDefaultDisplay();

    Log.d("ORIENTATION_TEST", "getOrientation(): " + mDisplay.getOrientation());

}

お使いのデバイスの画面がデバイス設定でロックされているかどうかを確認してくださいデバイス設定でロックされています設定>ディスプレイ>画面の自動回転そのチェックボックスがオフになっている場合、Androidはアクティビティの向きの変更を報告しません。明確にするために:アクティビティを再起動しません。私の場合、私は 、あなたが説明したように。

これらの行をonCreate()に追加すると、プログラムからこれを確認できます。

int sysAutoRotate = 0;
try {
        sysAutoRotate = Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION);
    } catch (SettingNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
Log.d("ORIENTATION_TEST", "Auto-rotate Screen from Device Settings:" + sysAutoRotate);

自動回転がオフの場合を返し、自動回転がオンの場合1を返します。別の試み。元のプログラムでは、マニフェストに設定した可能性があります

Android:screenOrientation="portrait"

同じ効果ですが、今回はアクティビティのみです。小規模なテストプログラムを作成した場合、この可能性は排除されます(だから私はそれをお勧めします)。

注:はい、方向/回転のトピック全体が実際に「興味深い」トピックです。いろいろ試して、Log.d()を使って、実験して、学んでください。

46
rgr_mt

現在表示されているコンテンツが横向きモードか縦向きか(電話の物理的な回転とは完全に独立している可能性がある)を知りたい場合は、次を使用できます。

getResources().getConfiguration().orientation

開発者向けドキュメント

パブリックintオリエンテーション
以降:APIレベル1

画面の全体的な向き。 ORIENTATION_LANDSCAPE、ORIENTATION_PORTRAIT、またはORIENTATION_SQUAREのいずれかです。

37
Kevin TeslaCoil

getOrientation()は非推奨です。代わりに、 getRotation() を試してください。

5
sahhhm

非推奨メソッドの使用を回避するには、[ here にあるAndroid Configuration class found]を使用します。 APIレベル1以降で動作し、最新のAndroidデバイスでも動作します。 (非推奨ではありません)。

例として、次のコードスニペットを検討してください。

Configuration config = getResources().getConfiguration();
if (config.orientation == Configuration.ORIENTATION_PORTRAIT)
{
    setContentView(R.layout.portraitStart);
}
else
{
    setContentView(R.layout.landscapeStart);
}

幸運なことに、この答えが誰にでも役立つことを願っています。

4
SyntaxRules

以下を使用する必要があります。

getResources().getConfiguration().orientation

ORIENTATION_LANDSCAPEORIENTATION_PORTRAITのいずれかです。

http://developer.Android.com/reference/Android/content/res/Configuration.html#orientation

2
Matteo Corti

2つの異なるレイアウトを作成し、異なる向きで異なるレイアウトを膨らませる必要があると思います。私はあなたに私のためにうまく機能しているサンプルコードを提供しています。カスタムアダプターの場合、アクティビティから渡すことができる「コンテキスト」。カスタムアダプタを使用している場合は、次のコードを試すことができます。

@Override
public View getView(final int position,
                    View convertView,
                    ViewGroup parent)
{
    View rowView = convertView;
    ViewHolder holder = null;
    int i = context.getResources().getConfiguration().orientation;

    if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (i == Configuration.ORIENTATION_PORTRAIT) {
            rowView = inflater.inflate(R.layout.protrait_layout, null, false);
        } else {
            rowView = inflater.inflate(R.layout.landscape_layout, null, false);
        }

        holder = new ViewHolder();
        holder.button = (Button) rowView.findViewById(R.id.button1);
        rowView.setTag(holder);

    } else {
        holder = (ViewHolder) rowView.getTag();
    }
    return rowView;
}

それ以外の場合は、コードに2つの異なるレイアウトを直接設定できます

    int i = context.getResources().getConfiguration().orientation;

        if (i == Configuration.ORIENTATION_PORTRAIT) {
                    ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.protrait_layout, name);
        } else {
                    ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.landscape_layout, name);
        }
1
Bharat Sharma
/* First, get the Display from the WindowManager */
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

/* Now we can retrieve all display-related infos */
int width = display.getWidth();
int height = display.getHeight();
int orientation = display.getOrientation();
1
Mitul Nakum

NexusOne SDK 2.3でも同じ問題が発生しました。

これで解決しました: Android phone の向きを確認してください。

0
NguyenDat