【问题标题】:replace layout on orientation change在方向更改时替换布局
【发布时间】:2012-12-12 20:57:52
【问题描述】:

我的应用在 LinerLayout 中有一个 webview 和一些按钮。

问题是,我希望按钮在纵向模式下位于底部,在横向模式下位于左侧,而 web 视图保持其状态。

两种不同的布局不起作用,因为它会强制重新创建刷新 web 视图的活动。现在我在活动标签中使用 android:configChanges="orientation" 所以 webview 不会在方向变化时刷新。

有没有办法在改变屏幕模式时替换按钮的布局?

人像模式

横向模式

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    我测试了片段,但是处理片段会使事情变得更加复杂,片段本身需要保存和恢复,这在具有 javascript 状态的 web 视图中可能不起作用,所以我搜索了更多,并在某处找到了一篇不错的文章并进行了一些修改我提出了一个我建议的解决方案:

    首先,添加android:configChanges="orientation|screenSize|keyboard|keyboardHidden",以便应用处理配置更改而不是android。

    为横向和纵向制作两种不同的布局。在这两种布局中而不是 webview 中放置一个 FrameLayout 作为 webview 的占位符。

    像这样定义 initUI 方法,并将与 UI 初始化相关的所有内容都放在这个方法中:

    public void initui()
    {
        setContentView(R.layout.main);
        if (wv == null) wv = new WebView(this);
        ((LinearLayout)findViewById(R.id.webviewPlace)).addView(wv);
        findViewById(R.id.home).setOnClickListener(this);
    }
    

    如果 webview 尚不存在,它将被创建并在 setContentView(R.layout.main) 之后添加到布局中。您需要的任何其他 UI 定制都是在此之后进行的。

    在onConfigurationChanged:

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        ((LinearLayout)findViewById(R.id.webviewPlace)).removeAllViews();
        super.onConfigurationChanged(newConfig);
        initUI();
    }
    

    在onConfigChange 中,webview 将从旧占位符中删除,initui 将被调用,这会将其添加回新布局。

    在oncreate() 中调用initui() 以便第一次初始化ui。

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        initUI()
    }
    

    我希望它对某人有所帮助。

    【讨论】:

    • 它无法正常工作。它重新启动 oncreate 方法
    【解决方案2】:

    如果您使用的是android:configChanges="orientation|screenSize"

    在清单中,它忽略“layout-land”中的 XML。如果您为景观创建不同的 XML,请不要在清单中为该活动使用 android:configChanges="orientation|screenSize" 标记。

    【讨论】:

    • 项目中有layout-land需要用到什么?
    【解决方案3】:

    将其放在layout-land 以获取您想要的横向布局。

    这个想法是,你不应该真正使用configChange="orientation",因为它有它的缺点。你可以找到详细的帖子here。如果你想改变你的布局,你应该手动处理你的状态。当然,您可以通过编程方式执行此操作,但如果您想使用 xml 执行此操作。您可以使用片段维护 webView。

    【讨论】:

    • 我说,那行不通。它重新创建视图并刷新 web 视图。 android:configChanges="orientation" 防止这种行为。
    • 我读到了片段,但不知道它是如何工作的!它在 android 2.2 中有效吗?
    • 使用 supportv4 库,是的。在许多现实生活中的应用程序中使用片段。何时了解它取决于您。另一个解决方案将为您提供帮助,它不需要片段。但是如果你想了解 Fragments,你可以在 NewProject>MasterDetailedFlow OR Viewpager templates 中查看模板。
    【解决方案4】:

    尝试使用此代码:

    @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            setContentView(R.layout.activity_splash);
        }
    

    【讨论】:

    • 这将删除所有设置为活动的侦听器,有没有办法恢复它们?
    【解决方案5】:

    使您的视图成为相对布局。当方向改变时,只需调整代码中每个视图的布局参数。 让您的按钮包含在线性布局中

    如..

    肖像

    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    buttonLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
    buttonLinearLayout.setLayoutParams(lp);
    
    
    LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    lp.addRule(RelativeLayout.ABOVE, R.id.buttons);
    webView.setLayoutParams(webParams);
    

    风景

    LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
    lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
    buttonLinearLayout.setOrientation(LinearLayout.VERTICAL);
    buttonLinearLayout.setLayoutParams(lp);
    
    
    LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    lp.addRule(RelativeLayout.TO_RIGHT_OF, R.id.buttons);
    webView.setLayoutParams(webParams);
    

    确保您使用的 LayoutParams 是 RelativeLayout 参数(始终使用视图父级的 Layoutparams)

    【讨论】:

      【解决方案6】:

      在清单中添加

      <activity android:name=".MyActivity"
            android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
            android:label="@string/app_name">
      

      和

      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
          if (Resources.getSystem().getDisplayMetrics().widthPixels>
                  Resources.getSystem().getDisplayMetrics().heightPixels)
          setContentView(R.layout.activity_layout1);
          else setContentView(R.layout.activity_layout2); 
      
      ...
      
      }
      

      和

      @Override
      public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);
      
      if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
          setContentView(R.layout.activity_layout1);
      } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
          setContentView(R.layout.activity_layout2);
      }
      

      }

      这里的文件: https://developer.android.com/guide/topics/resources/runtime-changes.html

      【讨论】:

        【解决方案7】:

        您可以在资源下添加值-(您需要的配置 - 例如土地、肖像)文件夹,并提及此配置所需的布局。就这么简单。

        请查看以下链接以获取更多信息- http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多