Как обнаружить изменение ориентации в макете в Android?



Я только что реализовал функцию изменения ориентации - например, когда макет изменяется от портрета к ландшафту (или наоборот). Как я могу определить, когда событие изменения ориентации завершено.



на OrientationEventListener не работает. Как я могу получать уведомления о событиях изменения ориентации макета?

356   6  

6 ответов:

использовать onConfigurationChanged способ деятельности. Смотрите следующий код:

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

вы также должны изменить соответствующие элемент в файле манифеста, чтобы включить android: configChanges Просто смотрите код ниже:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

Примечание: С Android 3.2 (уровень API 13) или выше, "размер экрана" также изменяется, когда устройство переключается между книжной и альбомной ориентацией. Таким образом, если вы чтобы предотвратить перезапуск среды выполнения из-за изменения ориентации при разработке для API уровня 13 или выше, необходимо объявить android: configChanges= "ориентация / screenSize" для API уровня 13 или выше.

надеюсь, что это поможет вам... :)

для загрузки макета в макет-земля папка означает, что у вас есть два отдельных макета, то вы должны сделать setContentView на onConfigurationChanged метод.

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.yourxmlinlayout-land);
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        setContentView(R.layout.yourxmlinlayoutfolder);
    }
}

если у вас есть только один макет, то нет необходимости делать setContentView в этом методе. просто

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

просто хотел показать вам способ сохранить весь ваш пакет после onConfigurationChanged:

создать новый пакет сразу после вашего класса:

public class MainActivity extends Activity {
    Bundle newBundy = new Bundle();

Далее, после "protected void onCreate" добавьте это:

@Override
public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            onSaveInstanceState(newBundy);
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            onSaveInstanceState(newBundy);
        }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBundle("newBundy", newBundy);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    savedInstanceState.getBundle("newBundy");
}

Если вы добавите это все ваши упакованные классы в MainActivity будут сохранены.

но лучший способ-добавить это в свой AndroidManifest:

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

переопределить метод действия onConfigurationChanged

использовать этот метод

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        Toast.makeText(getActivity(),"PORTRAIT",Toast.LENGTH_LONG).show();
       //add your code what you want to do when screen on PORTRAIT MODE
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        Toast.makeText(getActivity(),"LANDSCAPE",Toast.LENGTH_LONG).show();
        //add your code what you want to do when screen on LANDSCAPE MODE
   }
}

и не забудьте добавить это в свой Androidmainfest.xml

android:configChanges="orientation|screenSize"

такой

<activity android:name=".MainActivity"
          android:theme="@style/Theme.AppCompat.NoActionBar"
          android:configChanges="orientation|screenSize">

    </activity>

создать экземпляр OrientationEventListener класс

OrientationEventListener mOrientationEventListener = new OrientationEventListener(YourActivity.this) {
@Override
public void onOrientationChanged(int orientation) {
    Log.d(TAG,"orientation = " + orientation);
}

Comments

    Ничего не найдено.