【问题标题】:Restart activity only on orientation change仅在方向更改时重新启动活动
【发布时间】:2017-03-07 11:20:44
【问题描述】:

我的应用程序有很多对话框。当我更改设备的方向时,对话框与输入的内容一起消失,因为在方向更改时会触发活动重启。我有两个选择:将每个对话框的内容保存在变量中,当活动重新启动时,我重新打开打开的那个并重新填充它。这会创建大量样板代码,并且还会与许多对话框混淆。我的另一个解决方案是在清单文件中使用android:configChanges="orientation",这将阻止活动重启。 (我的布局不会在不同的方向上改变,所以没关系)但是很多人认为这是一种不好的做法,因为它会阻止活动在其他配置更改时重新启动。

有没有办法防止活动仅在方向更改时重启,并在其他配置更改时保持?

【问题讨论】:

  • developer.android.com/guide/topics/manifest/… 它可以帮助你做出决定
  • 您希望您的应用同时在landscapeportrait 模式下工作吗?如果没有,您可以在清单中的每个活动标签上设置android:screenOrientation='landscape',您就完成了。

标签: android android-activity screen-orientation android-configchanges


【解决方案1】:

来自configChanges 文档:
指定活动将自行处理的一项或多项配置更改。如果未指定,如果系统中发生任何这些配置更改,则活动将重新启动。

因此,如果您设置android:configChanges="orientation|screenSize",它应该不会影响除方向之外的其他配置更改。

【讨论】:

  • 文档说我应该设置 android:configChanges="orientation|screenSize" 会影响方向以外的任何其他东西吗?
  • 你是对的,screenSize 也应该被添加,因为当设备在纵向和横向之间切换时它也会改变。 (更新了我的答案)。这不会影响其他任何事情。
  • 我的工具栏项目过去可以调整到可用空间,但现在不能。如何重新创建操作栏以使其更新?
  • 这是因为现在没有在屏幕旋转时重新创建活动。查看此解决方案的对话框stackoverflow.com/a/15729764/3185707
  • 我可以只重新创建工具栏而不是其余部分吗?
【解决方案2】:

检查这个https://stackoverflow.com/a/15444485/1577428

对话框消失,因为在轮换中它会重新启动活动,因此必须保存对话框实例并在轮换后买回这是迄今为止的最佳做法

【讨论】:

    【解决方案3】:

    您可以使用 configChanges,这不是一个坏习惯,但可以根据需要使用它。检查this SO 帖子。

    【讨论】:

    • 这个答案建议添加它可能会阻止应用程序正确重启。是orientation|screenSize参数的情况吗?
    【解决方案4】:

    如果您对上述答案不满意,这似乎不适合您。您可以创建一个经理假设 DialogManager

    公共类 DialogManager {

    private AlertDialog  mAlertDialog;
    
    public void setAlertDialog(AlertDialog alertDialog) {
        mAlertDialog = alertDialog;
    }
    
    public AlertDialog getAlertDialog() {
        return mAlertDialog;
    }
    

    }

    并且实例是在应用程序类中创建的

    公共类 SampleApplication 扩展应用程序 {

    private DialogManager mDialogManager;
    private static SampleApplication mSampleApplication;
    
    public SampleApplication() {
        super();
        mSampleApplication = this;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        mDialogManager = new DialogManager();
    }
    
    public DialogManager getDialogManager() {
        return mDialogManager;
    }
    
    public static SampleApplication getApplication() {
        return mSampleApplication;
    }
    

    }

    因此,每当您更改屏幕方向时,您都可以在 DialogManager 中设置对话框实例,因为应用程序只会创建一次它的实例。

    如果这些解决方案不适合您,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多