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