【问题标题】:Android + XAMARIN + Force screen to stay in "Portrait" mode (using AndroidManifest)Android + XAMARIN + 强制屏幕停留在“纵向”模式(使用 AndroidManifest)
【发布时间】:2016-04-13 21:37:46
【问题描述】:

我在这里阅读了这个问题的一些答案,但不知何故我没有让它工作。

我的 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 开发应用程序

【问题讨论】:

  • 在你的活动标签中添加这一行 android:screenOrientation="portrait"
  • 试过了,但我仍然可以切换方向

标签: android android-layout xamarin android-manifest


【解决方案1】:

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

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

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

更新:

我收到了很多关于这个 Q/A 的 IM 问题,所以我正在扩展关于为什么使用 manifest 方法不起作用的答案。

Xamarin 会为你的活动自动生成一个完全限定的类名,这些活动没有分配给你的活动类的 Name 属性。

如果您查看来自 Xamarin Android .apk 的签名/生成清单 你会看到一个类名:

md5d2519388ea1895e3e3594794d2e0c4ce.MainActivity

由于您使用点名类标识符标记清单,该标识符将获得包名前缀:

<activity android:name=".MainActivity"

完全限定类名不匹配,因为以句点开头的类名将获得包名前缀,而这些类名与自动生成的类名不匹配。

您可以通过在Activity 属性中使用Name 元素来解决此自动生成的完全限定类名称,以防止创建自动生成的名称,即:

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

现在,假设您的包名是“com.sushihangover.playscriptstarling”,使用:

<activity android:name=".MyBigBadGameEveryOneShouldPlay"

在您的清单中将用作类名,一旦在清单中展开与您的代码中的匹配。

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

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

【讨论】:

  • 这行得通。尝试了所有其他不起作用的解决方案。想知道为什么
  • 通过活动类设置此选项可防止景观成为选项,清单将提供默认或提示的首选项,但不会阻止它发生
  • @fbueckle 其他选项肯定适用于 Native android。 :) 可能是因为 XAMARIN 无法正常工作。
  • @MKJParekh 问题之一是 Xamarin 目前不通过点名约定处理 Android 分类命名,这通常也是所有 Android 开发人员使用的标准方式。这也是为 3rd-party Launcher 等项目标记类名称的问题;您必须添加包名和类名。所以最终“更容易”标记活动,因为包名称更改会破坏您的硬代码清单类名称;-/
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    <activity android:name=".MainActivity"
    android:configChanges="keyboard|keyboardHidden|orientation"
    android:screenOrientation="portrait" />
    

    使用上面的编码在&lt;activity&gt;标签中添加android:screenOrientation="portrait"

    【讨论】:

      【解决方案4】:

      添加这一行,

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

      【讨论】:

        【解决方案5】:

        试试这个:

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

        【讨论】:

          【解决方案6】:

          使用这个

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-30
            • 1970-01-01
            • 1970-01-01
            • 2011-05-14
            • 2014-05-18
            • 1970-01-01
            • 1970-01-01
            • 2021-05-05
            相关资源
            最近更新 更多