如何为所有活动设置Orientation Fixed

Xor*_*sat 6 layout android orientation

Android布局.如何为AndroidMainfest.xml的应用程序标签中的所有活动设置Orientation Fixed?我不想单独为每个活动设置方向.提前致谢.

byt*_*der 18

GoogleIO应用程序有一个ActivityHelper类.它有一个静态方法initialize(),用于处理每个Activity发生的很多事情.然后onCreate(),您需要记住的方法中只有一行代码,可以处理设置该值以及每个活动所需的其他几个值.

编辑:没有导入或类似的东西.创建一个名为ActivityHelper的类

public class ActivityHelper {
    public static void initialize(Activity activity) {
        //Do all sorts of common task for your activities here including:

        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的所有活动中onCreate()方法调用ActivityHelper.initialize() 如果你打算开发表格,你可能要考虑使用:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
Run Code Online (Sandbox Code Playgroud)

在这里写了更多相关内容

编辑:对不起...您需要传递活动.看到上面的代码


jak*_*b.g 5

接受的答案以及任何建议setRequestedOrientation都远非完美,因为如文档中所述在运行时调用setRequestedOrientation可能会导致活动重新启动,这会影响屏幕之间的动画。

如果可能,最好在 中设置所需的方向AndroidManifest.xml。但是由于依赖每个开发人员在添加新活动时记住修改清单很容易出错,因此可以在构建时通过在构建期间编辑 AndroidManifest 文件来完成。

但是,您需要注意以这种方式编辑 AndroidManifest 的一些注意事项:

  • 如果您<activity-alias>在输出清单中有一些条目,您应该匹配<activity(?!-)而不是<activity避免修改这些条目(并使用replaceAll匹配正则表达式的 ,而不是replace匹配字符串的 )
  • 小心不要匹配您无法控制的活动。见facebook + android : 只有全屏不透明活动可以请求方向

我的要求是将所有活动更新为具有固定方向,但仅限于发布版本。我用一些代码实现了它,build.gradle其中在 AndroidManifest 中进行了简单的字符串替换(假设没有任何活动已经指定了方向):

Android Studio 3.0 兼容解决方案示例(仅触及匹配的活动com.mycompany.*):

android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        if (output.name == "release") {
            output.processManifest.doLast {
                String manifestPath = "$manifestOutputDirectory/AndroidManifest.xml"
                def manifestContent = file(manifestPath).getText('UTF-8')
                // replacing whitespaces and newlines between `<activity>` and `android:name`, to facilitate the next step
                manifestContent = manifestContent.replaceAll("<activity\\s+\\R\\s+", "<activity ")
                // we leverage here that all activities have android:name as the first property in the XML
                manifestContent = manifestContent.replace(
                        "<activity android:name=\"com.mycompany.",
                        "<activity android:screenOrientation=\"userPortrait\" android:name=\"com.mycompany.")
                file(manifestPath).write(manifestContent, 'UTF-8')
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Android Studio 2.3 兼容解决方案示例(匹配所有活动,但不匹配<activity-alias>条目):

android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        if (output.name == "release") {
            output.processManifest.doLast {
                def manifestOutFile = output.processManifest.manifestOutputFile
                def newFileContents = manifestOutFile.getText('UTF-8')
                        .replaceAll(/<activity(?!-)/, "<activity android:screenOrientation=\"userPortrait\" ")
                manifestOutFile.write(newFileContents, 'UTF-8')
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用userPortrait而不是portrait因为我更喜欢给用户更多的灵活性。

如果您只有变体(调试、发布),则上述方法开箱即用。如果您还有其他口味,则可能需要稍微调整一下。

您可能希望if (output.name == "release")根据需要删除。