当我在其中动态添加/删除ImageButtons时,我无法弄清楚如何让我的GridLayout在屏幕上持续更新UI。我尝试在其他答案中添加invalidate()
,requestLayout
refreshDrawableState
和可见性技巧(再次从GONE
切换到VISIBLE
),但是没有办法做到
以下是我的活动中的相关代码:
DataInputStream data = new DataInputStream(btSocket.getInputStream());
while (true) {
readImage("1"); // adds one image button
readImage("2"); // adds one image button
readImage("3"); // adds one image button
}
});
上面的代码在一个单独的线程中运行,该线程侦听通过BlueTooth连接发送的图像数据。 readImage
调用阻塞,直到收到数据(图像以3批次发送),第一次调用清除所有现有按钮(如果有)。
readImage
方法包含以下代码,用于在通过runOnUiThread
或imageGridLayout.post
收到图片时将ImageButtons添加到GridLayout(我尝试了两种,同样的结果)。
runOnUiThread(new Runnable() {
@Override
public void run() {
Button but = new Button(this);
// Set different images for pressed and normal states
StateListDrawable states = new StateListDrawable();
states.addState(new int[] { },new BitmapDrawable(getResources(), bmp));
states.addState(new int[] {android.R.attr.state_pressed},new BitmapDrawable(getResources(), modifiedBmp));
but.setBackground(states);
[...] // set various layout parameters
but.setOnClickListener(buttonlistener);
imageGridLayout.addView(but);
}
});
目前,每次收到批次时,只显示两个按钮,即使GridLayout确实包含三个子节点。第三个ImageButton永远不会显示在屏幕上。此外,按钮单击侦听器和状态更改不起作用。
如果我在Activity的主线程内部使用虚拟ImageButtons手动填充GridLayout,则按钮会显示并完美运行。
调用runOnUiThread
或imageGridLayout.post
来更改用户界面的这个要求让我感到害怕。解决方案是什么?