【问题标题】:How can I set Orientation Fixed for all activities如何为所有活动设置固定方向
【发布时间】:2018-12-13 16:19:33
【问题描述】:

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

【问题讨论】:

    标签: android layout orientation


    【解决方案1】:

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

    编辑:没有导入或类似的东西。创建一个名为 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

    编辑:抱歉...您需要通过 Activity。见上面的代码

    【讨论】:

    • 谢谢 bytebender,你能告诉我如何在我的项目中使用 ActivityHelper 类吗?任何例子都会很明显。我关注了您的链接,但仍然感到困惑。
    • 给我一点...我今晚稍后会写一些代码并在这里发布。
    • 非常感谢您的反馈,我只是想知道,在我的项目中,我必须导入哪些文件或 jar,以及如何调用静态方法。等待您的友好回应。
    • @Eugene 如果您将问题移出 cmets 并创建一个新的 Stack 问题,您更有可能得到问题的答案...
    • @bytebender,很好的答案好友。非常感谢您的帮助。
    【解决方案2】:

    接受的答案,以及任何暗示 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 兼容解决方案示例(匹配所有活动,但不匹配&lt;activity-alias&gt; 条目):

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

    【讨论】:

      【解决方案3】:

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

      你有类似“BaseActivity”的东西,而不是 onCreate 它你可以编写这样的代码:

      例如: BaseActivity 扩展 AppCompatActivity,稍后你使用 YourActivity 扩展 基础活动

      肖像

      this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
      

      风景

      this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
      

      【讨论】:

      • 泛型在哪里?
      • @CoolMind 我的意思是,当您使用泛型编写项目时,您必须自己创建它们。 TLDR 你创建类 BaseActivity 扩展 AppCompatActivity 或其他东西,然后在你的所有活动中你扩展你的 baseActivity。 并在创建的基础活动中编写这些行
      • 然后你应该说:“如果你从 BaseActivity 扩展你的活动”。你的想法不错。
      【解决方案4】:

      (Monodroid/C# 代码)

      你可以创建一个抽象基类

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

      那么你所有的活动都必须继承这个类而不是Activity

      有点像

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

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

      【讨论】:

        【解决方案5】:

        我得到了最好的解决方案。您不必将任何活动作为参数和东西传递。

        这是你必须做的。

        创建一个类并像这样扩展您的应用程序。 实现 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);
                      }
                });
            }
        }
        

        在此之后,在 &lt;application block&gt; 内的 Manifest 文件中添加以下内容:

        android:name=".OldApp"
        

        最终结果会是这样的:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-11
          • 1970-01-01
          • 1970-01-01
          • 2018-10-23
          相关资源
          最近更新 更多