【问题标题】:Android setLayoutParams not working on API16Android setLayoutParams 不适用于 API16
【发布时间】:2014-01-10 10:56:09
【问题描述】:

我正在向 TableLayout (TableRow) 添加按钮,并且我希望每行顶部有 10 个按钮,但是当使用 API16(可能是所有 API10 > 但我没有对此进行测试)时,它只是在 5 个按钮(我认为太大了,这就是为什么我在它们上尝试 wrap_content,也尝试填充到 1,1,1,1 并且它在 API 10 上工作,使它们非常小,但在 API16 上没有发生任何事情)这发生在模拟器和我的设备上也是。

这是我想要的结果:http://img10.imageshack.us/img10/2243/fe32.png (API10)

这是我得到的结果:http://i.imgur.com/VpH8Hu1.png (API16)

java:

   public class Keyboard extends Activity implements OnClickListener{
        TableLayout TblLayout;
        TableRow tr;
        String[] numRow = {"0","1","2","3","4","5","6","7","8","9"};
        String[] engKeys = {"q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m"};
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_keyboard);

            TblLayout = (TableLayout) findViewById(R.id.tblLayout);
            createRows(numRow);
            createRows(engKeys);
        }

        public void createRows(String[] keyValues){
               int i = 0;
                while (i < keyValues.length) {
                    if (i % keyValues.length == 0 || i % 10 == 0) {
                        tr = new TableRow(this);
                        TblLayout.addView(tr);
                        tr.setLayoutParams(new TableRow.LayoutParams( 
                                TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
                    }
                    Button btn = new Button(this);
                    btn.setText(keyValues[i]);
                    btn.setGravity(1);
                    btn.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT ,TableRow.LayoutParams.WRAP_CONTENT));
                    btn.setId(i);
                    btn.setBackgroundColor(0xFFFFFF);
                    btn.setOnClickListener(this);
                    tr.addView(btn);
                    i++;
                }
            }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

        }
    }

xml:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/tblLayout"
     >

</TableLayout>

【问题讨论】:

    标签: android xml android-button android-tablelayout


    【解决方案1】:

    一种解决方案是使用 LinearLayoutweightSum 属性

    How to set Table width and number of Columns in TableLayout in Android

    如果您为每个Button 设置android:weightSum="1" 并使用android:layout_weight="0.1",它将适用于所有设备,但是文本很可能会被裁剪。为避免裁剪,您需要动态计算可用宽度并确定可以插入多少行以使每个 Button 文本完全可见。

    【讨论】:

    • 如果必须,我会这样做,但为什么我的代码在较低的 API 上工作,但在较高的 API 上却不行?我找不到任何说明上述任何功能已被 newwer API 删除或弃用的地方
    • 您使用的是相同的设备还是不同的设备?
    • 我已经在 ADT 的模拟器(Nexus one 4.1.2 API16 和 2.3.3 API10)上测试了这个,也在我的真实设备 SGS2 4.1.2 和 Galaxy mini 2.3.3 上进行了测试,结果是相同(适用于所有 2.3.3 设备,但不适用于 4.1.2 设备)
    • 它甚至不仅仅是 setLayoutParams,像 .setHeight 和 .setWidth 这样的基本东西会影响较低的 API,但不会影响新的 API,这是怎么回事?
    【解决方案2】:

    没关系,发现问题,必须在更改其属性之前将按钮添加到 TableRow 中。

    【讨论】:

      【解决方案3】:

      这不是对这个问题的直接回答,而是解释为什么 setLayoutParams 的行为因 api 版本而异。 如果您比较 api 17 和 16 中的 setLayoutParams 实现,您会注意到一个区别是 resolveLayoutParams();在 api 17 中使用的,而不是旧版本。该方法可以设置最新的布局参数。因此,如果您希望您的 setLayoutParams 在所有 API 中以相同的方式工作,请确保您在 onMeasure() 之后调用它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        相关资源
        最近更新 更多