Android + XAMARIN + Force screen, чтобы остаться в режиме "Портрет" (с помощью AndroidManifest)

Я прочитал некоторые ответы на эту проблему здесь, но почему-то я не могу заставить ее работать.

Мой AndroidManifest.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mWidas2.mWidas2" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
  <uses-sdk />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <application android:label="WQS" android:icon="@drawable/temporaryIcon">
    <activity android:name=".MainActivity"
    android:configChanges="keyboard|keyboardHidden|orientation" />
  </application>
</manifest>

Я все еще могу переключиться в ландшафтный режим, и поскольку макет становится довольно уродливым в ландшафтном режиме, я хочу избежать этого. Помощь очень ценится.

может иметь любое значение: я разрабатываю приложение с последним Xamarin

6 ответов


вы можете activity на portrait С помощью атрибута class:

[Activity (Label = "MyMainScreen", MainLauncher = true, ScreenOrientation = ScreenOrientation.Portrait)]
public class Activity1 : Activity

это единственный способ, который заставит действие всегда быть портретным из-за автоматически сгенерированных имен классов, созданных Xamarin без жесткого кодирования имен классов.

обновление:

я получил много вопросов IM относительно этого Q / A, поэтому я расширяю ответ на то, почему использование метода манифеста не работает.

Xamarin автоматически генерирует полное имя класса для ваших действий, которые не имеют Name атрибут, присвоенный вашему классу активности.

если вы посмотрите на подписанный / сгенерированный манифест из Xamarin Android .apk вы увидите имя класса, например:

md5d2519388ea1895e3e3594794d2e0c4ce.MainActivity

поскольку вы помечаете свой манифест идентификатором класса имени точки, который получит имя пакета с префиксом:

<activity android:name=".MainActivity"

на полное имена классов не совпадают с класса имя, которое начинается с точки, получит префикс с именем пакета, и они никогда не совпадают с автоматически сгенерированным именем класса.

вы можете обойти это автоматически сгенерированное полное имя класса, используя Name элемент Activity атрибут для предотвращения автоматического создания имени, Т. е.:

[Activity(Label = "PlayScriptStarling", Name = "com.sushihangover.playscriptstarling.MyBigBadGameEveryOneShouldPlay", MainLauncher = true, Icon = "@mipmap/icon")]

теперь, предполагая, что ваше имя пакета - " com.сушиханговер.playscriptstarling", используя:

<activity android:name=".MyBigBadGameEveryOneShouldPlay"

в манифесте будет работать, как имя класса, развернутое в манифесте, совпадает с именем в коде.

проблема в том, что если ваше имя пакета изменится, вы сломаете свой dot class names в манифесте. Итак, используя ScreenOrientation = ScreenOrientation.Portrait - это более чистый способ назначения ориентации, который не требует назначения полного имени класса для каждого из ваших действий и не прерывается, если имя пакета изменяется.

Примечание:Name элемент внутри Activity атрибут class не поддерживает dot class names и требует использования полностью развернутого имени класса. Это было отправлено в Xamarin в качестве запроса функции...


Android Изменение Ориентации Экрана (Портрет - Пейзаж)

1. Блокировка изменения ориентации экрана в Android

ваш экран всегда будет отображаться в портретном режиме, когда вы поворачиваете устройство, никакие изменения не будут применяться для текущей деятельности.

android:screenOrientation="portrait"

если вы хотите заблокировать все экраны приложений. вы должны написать вышеуказанный код для всех действий приложения.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mWidas2.mWidas2" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
  <uses-sdk />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <application android:label="WQS" android:icon="@drawable/temporaryIcon">
    <activity android:name=".MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboard|keyboardHidden|orientation" />
  </application>
</manifest>

2. Замок ориентации экрана (поворот экрана) программно в Android

этот вариант немного сложнее. Что нам нужно сделать, так это получить событие изменения ориентации экрана (изменение вращения), затем как для ландшафтного, так и для портретного режима мы установим эфирный пейзаж или портретный режим в соответствии с нашим требованием. Ниже приведен код. Мы всегда будем устанавливать портретный режим, поэтому экран всегда будет оставаться в портретном режиме.

// Check screen orientation or screen rotate event here
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen for landscape and portrait and set portrait mode always
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }

3. Изменить ориентацию экрана программно в любое время в Android

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

4. Как получить ориентацию экрана во время выполнения

//Get current screen orientation
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        int orientation = display.getOrientation(); 
         switch(orientation) {
            case Configuration.ORIENTATION_PORTRAIT:
                setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                break;
            case Configuration.ORIENTATION_LANDSCAPE:
                setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                break;                  
        }

5. Найти событие изменения ориентации экрана в Android

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

        // Checks the orientation of the screen for landscape and portrait
        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();
        }
    }

<activity android:name=".MainActivity"
android:configChanges="keyboard|keyboardHidden|orientation"
android:screenOrientation="portrait" />

используйте вышеуказанную кодировку add android:screenOrientation="portrait" на <activity> tab.


добавить эту строку,

<activity android:name=".MainActivity"
 android:screenOrientation="portrait"
 android:configChanges="keyboard|keyboardHidden|orientation" />

попробуйте это:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mWidas2.mWidas2" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
  <uses-sdk />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /
  <application android:label="WQS" android:icon="@drawable/temporaryIcon
    <activity android:name=".MainActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:screenOrientation="portrait" />
  </application>
</manifest>

использовать

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mWidas2.mWidas2" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
  <uses-sdk />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <application android:label="WQS" android:icon="@drawable/temporaryIcon">
    <activity android:name=".MainActivity"
android:screenOrientation="portrait"
    android:configChanges="keyboard|keyboardHidden|orientation" />
  </application>
</manifest>

или

Если вы хотите изменить экран ориентация at времени добавить следующее

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//For Portrait

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//For Lndscape