如何为所有活动设置Orientation Fixed

时间:2011-07-05 12:36:16

标签: android layout orientation

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

5 个答案:

答案 0 :(得分:17)

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

然后在你的所有活动onCreate()方法中调用ActivityHelper.initialize() 如果您计划开发表格,也可以考虑使用:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

我写了更多关于这个here

的文章

修改抱歉......您需要传递活动。见上面的代码

答案 1 :(得分:4)

接受的答案以及任何暗示setRequestedOrientation的内容都远非完美,因为as stated in documentation在运行时调用setRequestedOrientation可能导致活动重新启动,其中其他因素影响屏幕之间的动画。

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

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

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

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')
            }
        }
    }
}

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')
            }
        }
    }
}

我使用userPortrait代替portrait,因为我更愿意为用户提供更多灵活性。

如果你只是变种(调试,发布),上面的工作开箱即用。如果你还有口味,你可能需要调整一下。

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

答案 2 :(得分:2)

如果您使用泛型编写项目。

你有类似&#34; BaseActivity&#34;在 onCreate 之内,您可以编写类似的代码:

例如: BaseActivity扩展了AppCompatActivity,稍后您使用YourActivity扩展 BaseActivity

<强>肖像

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

<强>风景

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

答案 3 :(得分:0)

(Monodroid / C#代码)

您可以创建抽象基类

public abstract class ActBase : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        RequestedOrientation = clsUtilidades.GetScreenOrientation();
    }
 }

然后,您的所有活动都必须继承此类,而不是活动

喜欢

[Activity(Label = "Orders", ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.Mcc | ConfigChanges.Mnc)]
public class ActOrders : ActBase
{
  ....

这样可以避免在事件中调用 ActivityHelper

答案 4 :(得分:0)

我有最好的解决方案。您不必通过任何活动作为参数和东西。

这就是您要做的。

创建一个类并像这样扩展您的应用程序。 实现onActivityCreated和onActivityStarted,并添加将方向设置为所需的代码。

public class OldApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityStarted(Activity activity) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }

            @Override
            public void onActivityCreated(Activity activity,
                                          Bundle savedInstanceState) {
              activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
              }
        });
    }
}

此后,在<application block>内的清单文件中添加以下内容:

android:name=".OldApp"

最终结果将是这样:

<application
    android:name=".OldApp"
    ...other values... >
    <activity
        android:name=".SomeActivity"></activity>
</application>