2011-08-01 6 views
7

画面の回転を検出することは可能ですか?つまり、他のアクティビティからのアクティビティの初期化とは明確に区別できるローテーションのみですか?画面の回転を検出するにはどうすればよいですか?

XXXの方法は、このために有用ではないと思われる、私は(削除フラグがある回転に反映されるべきではないと思われる)starting Intentからflagを除去/追加しようとしている、とアンドロイドを追加しようとしています。マニフェストのアクティビティに対してconfigChanges = "orientation"が返されますが、onConfigurationChangedメソッドは1秒おきに呼び出されるように思われます。

私は何かが欠けていると思います...しかし、他の関連するスレッドで明確な解決策を見つけられませんでした。

アイデア?

+0

風景から肖像画に、またはその逆に切り替えると、あなたはどういう意味ですか? – Pengume

+0

このスレッドは同じではありませんか? :http://stackoverflow.com/questions/4843809/how-do-i-detect-screen-rotation – Viren

+0

onConfigurationChangedメソッドでは、画面の回転のように発生したConfigurationChangedのタイプを検出できます。 – mikepenz

答えて

11

マニフェスト:

<activity android:name=".MyActivity" android:configChanges="screenSize|orientation|screenLayout|navigation"/> 

活動:

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    Log.d("tag", "config changed"); 
    super.onConfigurationChanged(newConfig); 

    int orientation = newConfig.orientation; 
    if (orientation == Configuration.ORIENTATION_PORTRAIT) 
     Log.d("tag", "Portrait"); 
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
     Log.d("tag", "Landscape"); 
    else 
     Log.w("tag", "other: " + orientation); 

    .... 
} 

How do I detect screen rotation

+0

ありがとうございます。しかし、質問を投稿する前に試してみましたが、これは私のためにはうまくいかず、理由はありませんが、毎回onConfigurationChangedは呼び出されません。オリエンテーションが元のものと同じになる(2回おき)場合にのみ呼び出されます。 – MerlinBG

+0

どこでテストしていますか?コードを投稿できますか?私は電話でそれをテストしたと働いた – Finuka

+0

私はエミュレータ上でそれをテストし、LogCatビューを見ている。 (のみ、この活動のための)マニフェストの android:configChanges="orientation|keyboard" とアクティビティクラスの @Override \t public void onConfigurationChanged(Configuration newConfig) { \t \t super.onConfigurationChanged(newConfig); \t \t \t \t Log.d(" - ", "onConfigChanged"); // TODO remove \t } ... – MerlinBG

0

も、このリンクを試してみてくださいあなたはこれをしようとしないのはなぜ? 、その後、

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
myOrientation = display.getOrientation(); 

をonConfigurationChanged メソッドをオーバーライドし、向きが変更されているかどうかを確認:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    if(newConfig.orientation != myOrientation) 
     Log.v(tag, "rotated"); 
    super.onConfigurationChanged(newConfig); 
} 

をすることを忘れないでください

は、携帯電話の向きを取得onCreatedアクティビティのマニフェストandroid:configChanges="orientation"に追加します。

1

画面の回転を検出するためにonConfigurationChangedメソッドを使用することはお勧めできません。このアクティビティの設定変更は、ユーザが画面を回転させると正しく動作しません。

この問題を解決するには、このソリューションを使用します。

public class SampleActivity extends AppCompatActivity { 
    public static final String KEY_LAST_ORIENTATION = "last_orientation"; 
    private int lastOrientation; 

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

     if (savedInstanceState == null) { 
      lastOrientation = getResources().getConfiguration().orientation; 
     } 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     checkOrientationChanged(); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     lastOrientation = savedInstanceState.getInt(KEY_LAST_ORIENTATION); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(KEY_LAST_ORIENTATION, lastOrientation); 
    } 

    private void checkOrientationChanged() { 
     int currentOrientation = getResources().getConfiguration().orientation; 
     if (currentOrientation != lastOrientation) { 
      onScreenOrientationChanged(currentOrientation); 
      lastOrientation = currentOrientation; 
     } 
    } 

    public void onScreenOrientationChanged(int currentOrientation) { 
     // Do something here when screen orientation changed 
    } 
} 

しかし、まだコードではありません私のプロジェクトでそれを使用するのに十分な良いので、私は自分のライブラリー(https://github.com/akexorcist/ScreenOrientationHelper)にこのコードを適用します。

compile 'com.akexorcist:screenorientationhelper:<latest_version>' 

あなたは[完了この基底クラス

public class MainActivity extends BaseActivity { 

    ... 

    @Override 
    public void onScreenOrientationChanged(int orientation) { 
     // Do something when screen orientation changed 
    } 
} 

で活動を広げるこの

public class BaseActivity extends AppCompatActivity implements ScreenOrientationHelper.ScreenOrientationChangeListener { 
    private ScreenOrientationHelper helper = new ScreenOrientationHelper(this); 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     helper.onCreate(savedInstanceState); 
     helper.setScreenOrientationChangeListener(this); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     helper.onStart(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     helper.onSaveInstanceState(outState); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     helper.onRestoreInstanceState(savedInstanceState); 
    } 

    @Override 
    public void onScreenOrientationChanged(int orientation) { 

    } 
} 

のような基本アクティビティクラスを作成することができます!

関連する問題