【问题标题】:Setting AndroidManifest's activity screenRotation different per flavor将 AndroidManifest 的活动 screenRotation 设置为不同的风格
【发布时间】:2016-10-01 22:54:23
【问题描述】:

有没有办法从 gradle 的 build.config 中动态设置 AndroidManifest 中的活动 screenOrientation?

我需要一种允许旋转的风格,以及另一种仅限纵向的风格。

我已经阅读了http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger,但他们的示例似乎只适用于普通字符串标签。

我尝试了两种方法。

使用 gradle 的 manifestPlaceholders: build.gradle:

productFlavors {
  flavorRotation {
    manifestPlaceholders = [ROTATION_PREF: "unspecified"]
  }
  flavorNoRotation {
    manifestPlaceholders = [ROTATION_PREF: "portrait"]
  }
}

使用 AndroidManifest.xml:

...
  <activity android:name=".ui.ActivityName"
    android:screenOrientation="${ROTATION_PREF}"/>
...

这似乎不起作用,没有给出错误,但是当我构建“flavorNoRotation”时旋转没有锁定为纵向


并尝试使用 gradle 的 resValue: build.gradle:

productFlavors {
  flavorRotation {
    resValue "string", "orientation", "unspecified"
  }
  flavorNoRotation {
    resValue "string", "orientation", "portrait"
  }
}

带有清单:

...
<activity android:name=".ui.ActivityName"
  android:screenOrientation="@string/orientation"/>
...

这样,它构建得很好,但是当我尝试安装到设备时它只是失败了,Android Studio 给出了消息: “安装失败并显示 INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION 消息。 卸载现有版本的 apk(如果存在)然后重新安装可能会解决此问题。”

单击“确定”只会显示事件日志错误“安装 APK 时出错”。 那么,构建类型/风格之间有什么不同的方向吗?

我宁愿避免在 BaseActivity 中以编程方式执行此操作。


编辑: 抱歉,我尝试了更多,我尝试的第一种方法确实有效。我之前一定犯了一个错误,在我自己的设备上安装了错误的构建风格。

唯一的问题是 Android Studio 会在“android:screenOrientation="${ROTATION_PREF}" 属性上发出警告,说它找不到它,尽管它会构建得很好并且可以工作。

感谢您的回答尝试。

【问题讨论】:

  • 我遇到了类似的问题,但在我的情况下,我尝试使用@string 资源调整launchMode,它可以成功构建而没有任何错误,但是安装会给出 INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION 并且永远无法成功安装.
  • @DavidCheung 试试我做的第一种方法。我用launchmode试了一下,它编译和安装对我来说很好。例如。在 build.gradle: manifestPlaceholders = [LAUNCHMODE:"singleTop"] 然后在 AndroidManifest: 。当我尝试使用字符串资源时,我遇到了同样的问题。

标签: android android-gradle-plugin android-manifest build.gradle


【解决方案1】:

这样做的最好方法是在 gradle 中添加 2 个风味,然后为“肖像”风味创建具有相同名称的目录并复制清单文件并将 screenOrientation 添加到纵向

在应用程序中添加这个:

flavorDimensions "default"
productFlavors {
    any {
        applicationIdSuffix ".any"
    }

    portrait {
        applicationIdSuffix ".portrait"
    }
}

然后在 potrait 目录的新清单文件中添加下面的活动

        android:screenOrientation="portrait"

【讨论】:

    【解决方案2】:

    分离源文件

    例如) .../src/flavorRotation/res/values/strings.xml

    &lt;string name="orientation"&gt;unspecified&lt;/string&gt;

    .../src/main/res/values/strings.xml

    &lt;string name="orientation"&gt;portrait&lt;/string&gt;

    【讨论】:

      【解决方案3】:

      不是这样的。我所做的是这个;创建一个“父”活动类,您可以在其中检查要使用的布局类型,如下所示:(只需确保您在子活动中首先调用 super)在这里您可以检查构建版本。

      public class DaddyActivity extends Activity {
      
         @Override
         protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
      
              // set landscape or portrait
              if (getResources().getBoolean(R.bool.landscape)) {
                  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
              } else {
              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
              }
          }
      }
      

      它寻找一个只有一个布尔值的 XML:风景。这是那个 XML(用于普通屏幕):

      <?xml version="1.0" encoding="utf-8"?>
      <resources>
          <bool name="landscape">false</bool>
      </resources>
      

      【讨论】:

        【解决方案4】:
        1-Create screen.xml file inside res/values folder and code
        
        <?xml version="1.0" encoding="utf-8"?>
        <resources>
            <string name="screen_type">phone</string>
        </resources>
        
        2-In your activity inside onCreate() after setContentView() check device type
        
        //checking tablets and phones
        String screenType = getResources().getString(R.string.screen_type); if (screenType.equals("7-inch-tablet") || screenType.equals("10-inch-tablet")) {
        
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        
        } else {
        
           setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } 
        

        希望它会有所帮助。

        【讨论】:

        • 这不能回答问题。 OP 希望从他的 gradle 文件中执行此操作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-26
        • 2014-01-17
        • 1970-01-01
        相关资源
        最近更新 更多