【问题标题】:Android. Setting left/right margin doesn't work安卓。设置左边距/右边距不起作用
【发布时间】:2013-09-02 13:07:30
【问题描述】:

这很奇怪,但在 Java 代码中设置左边距或右边距在某些设备/平台上不起作用。

这里是代码。 简单的xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    >

    <View
        android:id="@+id/myView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="0dp"
        android:background="#00ff00" />

</FrameLayout>

Java:

@Override
public void onConfigurationChanged (Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);

    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)findViewById(R.id.myView).getLayoutParams();
        params.leftMargin = 50;
        params.rightMargin = 50;
        params.topMargin = 50;
        params.bottomMargin = 50;
        findViewById(R.id.myView).requestLayout();
    }
}

所以我在 FrameLayout 中有一个绿色视图。在旋转时,我改变了视图的边距。 (我的活动有 android:configChanges="orientation|screenSize")

结果如下:

三星 Galaxy S 3 (Android 4.1.2)(运行良好)

Sony Ericsson Xperia Arc S (Android 4.0.4)(工作奇怪!)

正如您在代码中看到的那样,在 Android 4.1.2 上可以正常工作。并且在 Android 4.0.4 上没有设置左右边距,但设置了上边距。为什么要顶?

我已经在模拟器上进行了测试。所有平台 >= Android 4 都可以正常工作。在 Android 2.3 上根本没有设置边距,甚至是顶部边距。

有人知道怎么处理吗?如何更改代码中的边距,使其适用于所有平台?

【问题讨论】:

    标签: java android margin


    【解决方案1】:

    索尼爱立信 Xperia Arc S (Android 4.0.4) 索尼 LT26ii (Android 4.0.4) 两者都不起作用 我别无选择,只能用RelativeLayout替换它

    【讨论】:

      【解决方案2】:

      当你像这样设置边距时

       params.leftMargin = 50;
          params.rightMargin = 50;
          params.topMargin = 50;
          params.bottomMargin = 50;
      

      它使用像素而不是 dp,这可以解释为什么它在不同设备上看起来不同尝试像这样将您的像素转换为 dp

      Converting pixels to dp

      【讨论】:

      • 谢谢,但没关系。这与 dp 和 px 无关。它是关于设置上边距(甚至按像素设置),而左边距根本没有设置。我想知道为什么并找出我可以从代码中做到这一点的方法。
      • 为什么不定义 2 种布局,一种用于水平,一种用于垂直,为什么要在代码中这样做?
      • 因为我不想重新创建布局。
      【解决方案3】:

      我遇到了和你一样的问题,我的解决方案是:创建一个新的 LayoutParams 而不是获取旧的。

       if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
      {
          FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(WIDTH, HEIGHT, Gravity.TOP);
          params.setMargins(50,50,50,50);
          findViewById(R.id.myView).setLayoutParams(params);
      }
      

      WIDTH 和 HEIGHT:也可以设置 android.widget.FrameLayout.LayoutParams.MATCH_PARENT 或 android.widget.FrameLayout.LayoutParams.WRAP_CONTENT

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-11
        • 2016-12-07
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        相关资源
        最近更新 更多