Android + XAMARIN +强制屏幕保持“纵向”模式(使用AndroidManifest)

时间:2016-04-13 12:15:28

标签: android android-layout xamarin android-manifest

我在这里阅读了这个问题的一些答案,但不知怎的,我没有让它发挥作用。

我的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 个答案:

答案 0 :(得分:14)

您可以使用类属性将activity标记为portrait

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

由于Xamarin自动生成的类名而不对类名进行硬编码,因此这是强制活动始终以纵向为基础的唯一方法。

更新

我已经收到很多有关此Q / A的IM问题,所以我扩展了为什么使用清单方法不起作用的答案。

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")]

现在,假设您的包名是&#34; com.sushihangover.playscriptstarling&#34;,使用:

<activity android:name=".MyBigBadGameEveryOneShouldPlay"
清单中的

将作为类名,一旦在清单中展开,就会与代码中的一个匹配。

问题是,如果您的包名更改,则会破坏清单中的dot class names。因此,使用ScreenOrientation = ScreenOrientation.Portrait是一种更简洁的分配方向,不需要您在每个活动中分配完全限定的类名,并且如果包名更改,则不会中断。

注意:Name class属性中的Activity元素不支持dot class names,并且需要使用完全展开的类名。这已作为功能请求提交给Xamarin ......

答案 1 :(得分:4)

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();
        }
    }

答案 2 :(得分:1)

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

android:screenOrientation="portrait"标签中使用上述编码添加<activity>

答案 3 :(得分:0)

添加此行,

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

答案 4 :(得分:0)

试试这个:

<?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>

答案 5 :(得分:0)

使用此

<?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>

如果您想在运行时更改屏幕方向,请添加以下内容

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//For Portrait

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//For Lndscape