我有一个自定义TextView
,我将其视为EditText
视图。用户按下“共享”按钮,包含TextView
的布局将保存为PNG图像并共享给社交网络。
我的问题是TextView
中有一个游标字符。在创建图像之前,我想删除光标字符。但是,如果我使用我创建和共享图像的相同方法删除角色,则应用程序崩溃,因为它没有机会重新绘制视图。
我的问题与How to force a view to redraw immediately before the next line of code is executed基本相同,但与此问题不同,我不需要更改背景资源。
我尝试调用invalidate()
,但这并没有解决问题,因为在我需要视图之前,UI永远不会有机会重绘。
我该怎么办?
这是我的代码:
public void shareToOtherApps(View v) {
RelativeLayout messageOutline = (RelativeLayout) findViewById(R.id.rlMessageOutline);
// Remove cursor from display (inputWindow is a TextView)
inputWindow.setText(converter
.unicodeToFontReadable(unicodeText.toString()));
inputWindow.invalidate(); // This line makes no difference
// Code to save image
messageOutline.setDrawingCacheEnabled(true);
Bitmap bitmap = messageOutline.getDrawingCache(true);
...
// Code to share image
...
// Add cursor back to display
updateDisplay();
}
答案 0 :(得分:0)
我解决了这个问题,但是将代码保存/共享runnable
内的图像并在删除光标字符后运行它。这会将runnable
代码放在消息堆栈的末尾,并允许UI在尝试保存视图图像之前更新其视图。
以下是代码摘要:
public void shareToOtherApps(View v) {
// Remove cursor from display (inputWindow is a TextView)
inputWindow.setText(converter.unicodeToFontReadable(unicodeText.toString()));
// Put this in a runnable to allow UI to update itself first
inputWindow.post(new Runnable() {
@Override
public void run() {
// Code to save image
RelativeLayout messageOutline = (RelativeLayout) findViewById(R.id.rlMessageOutline);
messageOutline.setDrawingCacheEnabled(true);
Bitmap bitmap = messageOutline.getDrawingCache(true);
// Code to share image
...
// Add cursor back to display
updateDisplay();
}
});
}