我正在创建一个按钮表,通过蓝牙控制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,但不确定。我在这里缺少什么?
答案 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的值。如果有人能解决这个问题,请发布你的解决方案,我会接受这个答案。在这一点上,我接受杰森的建议。