单击行的所有元素后,TableRow重新缩放

时间:2014-12-15 11:17:01

标签: android android-tablelayout

我正在创建一个按钮表,通过蓝牙控制LED矩阵。 我在网上找到了布莱恩的视频教程,并按照他的动态按钮和图像视频来实现这一点。

以下是代码:

    public class DrawerMode extends Activity {
    private static final int NUMOFCOL = 15;
    private static final int NUMOFROW = 8;
    Button buttons[][] = new Button[NUMOFROW][NUMOFCOL];

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        //Assign content
        setContentView(R.layout.activity_draw_mod);
        fillTable();



    }

    private void fillTable() {
        TableLayout tableLayout = (TableLayout) findViewById(R.id.drawer_table);
        for( int iter_R = 0; iter_R!= NUMOFROW; iter_R++){
            TableRow tableRow = new TableRow(this);
            tableRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT,TableLayout.LayoutParams.WRAP_CONTENT,1.0f));
            tableLayout.addView(tableRow);
            for(int iter_C = 0; iter_C != NUMOFCOL; iter_C++){
                final int FINAL_COL = iter_C;
                final int FINAL_ROW = iter_R;
                Button button = new Button(this);
                button.setLayoutParams(new TableRow.LayoutParams( TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT, 1.0f));
                button.setText("" + iter_C + "," + iter_R);             
                button.setPadding(0, 0, 0, 0);
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        whenBtnClicked(FINAL_COL, FINAL_ROW);
                    }
                });
                tableRow.addView(button);
                buttons[iter_R][iter_C] = button;
            }
        }
    }

    private void whenBtnClicked(int col, int row) {
        //Toast.makeText(this, "Button clicked: " + FINAL_COL + "," + FINAL_ROW, Toast.LENGTH_SHORT).show();
        Button button = buttons[row][col];
        // Lock Button Sizes:
        lockButtonSizes();
        int newWidth = button.getWidth();
        int newHeight = button.getHeight();
        Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_dark_blue);
        Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, true);
        Resources resource = getResources();
        button.setBackground(new BitmapDrawable(resource, scaledBitmap)); // Change text on button:
        button.setText(" ");
    }

    private void lockButtonSizes(){
        for (int row = 0; row < NUMOFROW; row++){
            for (int col = 0; col < NUMOFCOL; col++){
                Button button = buttons[row][col];
                int width = button.getWidth();
                button.setMinWidth(width);
                button.setMaxWidth(width);
                int height = button.getHeight();
                button.setMinHeight(height);
                button.setMaxHeight(height);
            }
        }
    }
}

效果很好,但在测试时我发现了以下问题。

当我点击随机按钮时效果很好:

[IMG] http://i.imgur.com/OYFJ6zJ.png?1[/img]

但是当我完成一行(点击行上的所有元素)时,我的意思是它开始重新调整整个表格中的按钮:

[IMG] http://i.imgur.com/ttAz4U0.png?1[/img]

我在想,可能会改变TableRow的LayoutParams,但不确定。我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

我认为你需要改变的布局参数是正确的。这一行

tableRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT,TableLayout.LayoutParams.WRAP_CONTENT,1.0f));

如果没有按钮显示文本,

会导致行的高度缩小,这似乎正在发生的事情。 TableLayout.LayoutParams确实支持设置固定宽度/高度,您可以通过首先获取设备的屏幕宽度/高度并相应地进行划分来合理地计算。

或者,如果这变得很麻烦,你可以设置 - 虽然这可能是一个太大的黑客 - TextViews中的默认文本在“未设置”按钮中带有一些透明文本(例如,“1,1” “)使高度与设置按钮相同。 This SO answer答案显示了如何制作透明文字。

答案 1 :(得分:0)

我确信这对所有情况都不是一个好的解决方案。但就像我想的那样,问题在于

 button.setLayoutParams(new TableRow.LayoutParams( TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT, 1.0f));

如果在单击整行后我理解正确,由于LayoutParams根据MATCH_PARENT值更改,TableRow会重新调整整行以符合此条件,因为整行的高度现在相同。不确定它是否以这种方式发生,但我认为这是因为我的解决方案。

我的工作是为LayoutParams添加特定值,而不是让系统将其弄清楚:

button.setLayoutParams(new TableRow.LayoutParams( 75, 50, 1.0f));

我知道这不是应该怎么做的。但由于我很快就会遇到最后期限,所以我再也不能花时间了。最有可能的正确方法是Jason建议获取屏幕尺寸并计算它。你可以这样做:

Display display = getWindowManager().getDefaultDisplay(); Point size = new Point();
display.getSize(size); 
int width = size.x; 
int height = size.y;

问题是要想出一个正确的公式来计算你可以传递给LayoutParam的值。如果有人能解决这个问题,请发布你的解决方案,我会接受这个答案。在这一点上,我接受杰森的建议。