Android setLayoutParams无法在API 16上运行

时间:2014-01-10 10:56:10

标签: android xml android-button android-tablelayout

我正在向TableLayout(TableRow)添加按钮,我希望每行有10个按钮顶部但是当使用API​​16(可能所有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>

3 个答案:

答案 0 :(得分:0)

一种解决方案是将LinearLayoutweightSum属性

一起使用

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这不是这个问题的直接答案,而是根据api版本解释为什么setLayoutParams表现不同的原因。 如果你比较api 17和16中的setLayoutParams实现,你会发现一个区别是resolveLayoutParams();在api 17中使用而不是旧版本。该方法可以设置最新的布局参数。因此,如果您希望所有apis中的setLayoutParams工作方式相同,请确保在onMeasure()

之后调用它