facebook twitter hatena line email

「Android/端末回転」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(onConfigurationChangedが回転前の縦幅横幅を取得してくる対策)
行56: 行56:
 
             }
 
             }
 
         }, 200);
 
         }, 200);
 +
 +
===何度かループさせる===
 +
    private int checkCount = 0;
 +
    private int prevHeight = 0;
 +
    @Override
 +
    public void onConfigurationChanged(Configuration newConfig) {
 +
        super.onConfigurationChanged(newConfig);
 +
        final Handler handler = new Handler();
 +
        handler.post(new Runnable() {
 +
            @Override
 +
            public void run() {
 +
                Log.i(TAG, "onConfigurationChanged width=" + imageView.getWidth());
 +
                Log.i(TAG, "onConfigurationChanged height=" + imageView.getHeight());
 +
                int height = imageView.getHeight();
 +
                if (height != prevHeight) {
 +
                    prevHeight = height;
 +
                    //LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height);
 +
                    //imageView.setLayoutParams(params);
 +
                }
 +
                if (checkCount <= 10) {
 +
                    checkCount = checkCount + 1;
 +
                    handler.postDelayed(runnable, 250);
 +
                }
 +
            }
 +
        });
 +
    }

2019年2月19日 (火) 16:59時点における版

回転時のライフサイクル

android/ライフサイクル

回転するときにActivityを破棄させない方法

AndroidManifest.xmlに以下を追加

<activity android:name=".MainActivity"
        android:configChanges="orientation|screenSize"></activity>

すると以下イベントは発生しなくなる。

  1. onCreate
  2. onStart
  3. onRestoreInstanceState
  4. onResume
  5. onWindowFocusChanged
  6. onPause
  7. onSaveInstanceState
  8. onStop
  9. onDestroy

代わりにonConfigurationChangedが発生するので以下コードで捕まえる

@Override
public void onConfigurationChanged(Configuration newConfig) {
       super.onConfigurationChanged(newConfig);
       Log.d(TAG, "onConfigurationChanged");
}

参考:https://qiita.com/myoshimu/items/4d891f8e0ec3abaa7662

参考:https://qiita.com/kobakei/items/5f38339dd6528fdc6b5d

onConfigurationChangedが回転前の縦幅横幅を取得してくる対策

thread処理させるとよい

   @Override
   public void onConfigurationChanged(Configuration newConfig) {
       super.onConfigurationChanged(newConfig);
       final Handler handler = new Handler();
       handler.post(new Runnable() {
           @Override
           public void run() {
               Log.i(TAG, "onConfigurationChanged width=" + imageView.getWidth());
               Log.i(TAG, "onConfigurationChanged height=" + imageView.getHeight());
           }
       });
   }

端末によってサイズが取得できない模様。

以下のように遅らせてもたまに取得できない模様・・・。

       handler.postDelayed(new Runnable() {
           @Override
           public void run() {
           @Override
           public void run() {
               Log.i(TAG, "onConfigurationChanged width=" + imageView.getWidth());
               Log.i(TAG, "onConfigurationChanged height=" + imageView.getHeight());
           }
       }, 200);

何度かループさせる

   private int checkCount = 0;
   private int prevHeight = 0;
   @Override
   public void onConfigurationChanged(Configuration newConfig) {
       super.onConfigurationChanged(newConfig);
       final Handler handler = new Handler();
       handler.post(new Runnable() {
           @Override
           public void run() {
               Log.i(TAG, "onConfigurationChanged width=" + imageView.getWidth());
               Log.i(TAG, "onConfigurationChanged height=" + imageView.getHeight());
               int height = imageView.getHeight();
               if (height != prevHeight) {
                   prevHeight = height;
                   //LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height);
                   //imageView.setLayoutParams(params);
               }
               if (checkCount <= 10) {
                   checkCount = checkCount + 1;
                   handler.postDelayed(runnable, 250);
               }
           }
       });
   }