【问题标题】:Layout problem with button margin按钮边距的布局问题
【发布时间】:2013-08-27 05:28:19
【问题描述】:

我在 android 应用程序中组织布局时遇到问题。我正在动态创建按钮并使用此代码将它们添加到我的布局中:

    LayoutInflater layoutInflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    for (int i = 0; i < NO_NUMBERS; i++){

        Button btn = new Button(this);
        btn = (Button) layoutInflater.inflate(R.layout.button, null);
        btn.setId(2000+i);
        Integer randomNumber = sort.getNumbersCopy()[i];
        btn.setText(randomNumber.toString());
        btn.setOnClickListener((OnClickListener) this);
        buttonList.addView(btn);
        list.add(btn);
    }

我将它添加到 LinearLayout:

<LinearLayout
    android:id="@+id/buttonlist"
    android:layout_alignParentLeft="true"
    android:layout_marginTop="185dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:orientation="horizontal"
    android:gravity="center_horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

</LinearLayout>

我正在导入这个我定义按钮布局的 .xml:

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:textSize="26dp"
android:textStyle ="bold"
android:textColor="#ffffff"
android:background="@drawable/button"
android:layout_marginLeft="8px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>

好吧,布局总是这样结束:

而不是这样的东西(甚至按钮之间的spce,方形按钮):

总结一下:我必须:

  • 在 xml 中描述按钮
  • 动态生成N个按钮
  • 将描述按钮的属性添加到动态创建的按钮中
  • 组织布局,以便在 buttonList 中均匀分布按钮,并在 tham 之间留出空格

【问题讨论】:

    标签: android layout android-layout


    【解决方案1】:

    请记住,android:layout_* 属性是 LayoutParams。它们是父级的参数,并影响父级在该视图上执行布局的方式。您在按钮上指定了 layout_margin 属性,但它们被忽略了。原因如下:

    由于LayoutParams 特定于父视图类型,因此当您使用布局中顶级视图上的LayoutInflaterlayout_ 属性扩展布局时,您需要提供正确父类型的实例将被丢弃。 (inflater 不知道要生成什么类型​​的LayoutParams。)

    由于 buttonList 是按钮视图的预期父级,请将您的 inflate 行更改为:

    btn = (Button) layoutInflater.inflate(R.layout.button, buttonList, false);
    

    【讨论】:

    • 嗯,我认为这根本不是问题。
    • 嗯,我试过了。您的解决方案产生了新问题。在这种情况下,layoutInflater 返回 buttonList。也许我用错了。如果是这种情况,我如何在 XML 中描述按钮布局并将其添加到某个按钮?
    • ups,对不起,我错过了方法调用中的“错误”:) 谢谢,解决了我的问题!
    • 很高兴听到这个消息! :) inflate 的返回值根据它是否将膨胀视图附加到第二个参数中指定的父级而有所不同。第三个可选布尔参数指定如果膨胀视图不为空,是否应将其添加到父级,默认为true。 (是的,这很烦人,我们很抱歉。:))参考:goo.gl/ak6z8
    • 如何为自定义具体视图执行此操作,就地创建,例如: val layout = LinearLayout(context, null, 0, style) 尽管视图类型是具体的,但此处忽略样式边距。
    【解决方案2】:

    在按钮本身上设置layout_weight 将导致按钮展开而它们之间没有空间。 LinearLayout 从不在其子视图之间添加空格。

    您应该将每一个都包裹在 FrameLayout 中并在您的按钮上使用 layout_gravity="center",然后在 FrameLayout 上设置 layout_weight="1"

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1">
        <Button android:layout_{width,height}="wrap_content"
           android:layout_gravity="center"/>
    </FrameLayout>
    

    【讨论】:

    • 好吧,“layout_weight”属性是我最后一次尝试解决这个问题。它当然失败了。 :)
    • 你有没有使用FrameLayout来包装每个Button?还要确保按钮实际上有扩展空间(也许去掉 LinearLayout 上的边距参数)
    • 在我的 nexus 上,屏幕尺寸不同(与此模拟器不同),空间足够,但结果相同。这似乎是一个很好的解决方案,但我不知道在那之后我该如何管理按钮。我必须动态地将它们添加到布局中,使用 XML 中描述的属性对它们进行膨胀,而不是对它们做一些事情。如果我膨胀这个,下一步该怎么做?之后请描述如何使用此布局。
    【解决方案3】:

    这也可以通过将 TextView 嵌入到 LinearLayout(垂直)中来实现

    text_view.xml

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="vertical"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent">
    
        <TextView
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:textAppearance="?android:attr/textAppearanceLarge"
                  android:text="Large Text"
                  android:id="@+id/textView"
                  android:layout_margin="10dp"
                  android:textColor="@color/white"/>
    
    </LinearLayout>
    

    这被嵌入到另一个视图中,其中根视图也是一个 LinerLayout。 一个复杂的解决方法...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多