我正在尝试在 EditText 中设置大文本,该操作可能需要 30 秒以上,因此我使用 ProgressDialog。它会显示,但没有动画,然后在操作完成后消失。这是我的简化代码:
class FileOpener extends AsyncTask<File, Integer, String> {
private ProgressDialog progress;
@Override
protected void onPreExecute() {
progress = new ProgressDialog(context);
...
progress.show();
}
@Override
protected StringBuilder doInBackground(File... files) {
return readFile();
}
@Override
protected void onPostExecute(String content) {
EditText editText = ...
editText.post(new Runnable() {
@Override
public void run() {
editText.setText(content);
progress.dismiss();
}
});
}
}
在设置文本时如何使进度对话框动画化?
我也尝试过在中使用它onPostExecute
,同样的事情,有对话框但没有动画......
EditText editText = ...
new Thread() {
@Override
public void run() {
editor.setText(content);
progress.dismiss();
}
}.start();
EDIT- 这不是关于我的 EditText 速度的问题,据我所知,这很糟糕。这个问题是here https://stackoverflow.com/questions/41885344/improve-edittext-performance-with-large-text?noredirect=1#comment70953334_41885344。无论我如何提高速度,设置文本对于大文件总是需要几秒钟,甚至对于顶级编辑应用程序也不需要。这个问题真正涉及的是如何保持加载对话框动画,因为目前,在 EditText 中设置文本时它不会动画。我知道如果不在 UI 线程中,则 UI 上没有任何内容可以更改,那么我如何更新/动画加载?如果这是不可能的或者太复杂或老套,那么我如何在设置文本时显示任何类型的加载动画。
您应该能够最小化动画暂停/停止
通过创建一个 EditText 并将其文本设置在您的doInBackground
并将其添加到您的视图中onPostExecute
(用户界面线程)。下面是一个使用 Activity 和您已经拥有的任务变体以及一些代码注释的示例:
public class Activity extends AppCompatActivity {
/**
* dummy edit text (or the old one if doing an update)
*/
private EditText dummyEditTextForShow;
/**
* that dummy's parent
*/
private ViewGroup viewGroupToAddEditTextTo;
/**
* that dummy's position in it's parent
*/
int indexOfDummy;
/**
* your progress dialog
*/
private ProgressDialog progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// create the things
progress = new ProgressDialog(this);
dummyEditTextForShow = new EditText(this);
// show the place holder
setContentView(dummyEditTextForShow);
// get its parent and index in parent
viewGroupToAddEditTextTo = (ViewGroup) dummyEditTextForShow.getParent();
indexOfDummy = viewGroupToAddEditTextTo.indexOfChild(dummyEditTextForShow);
new FileOpener().execute();
}
class FileOpener extends AsyncTask<File, Integer, EditText> {
@Override
protected void onPreExecute() {
progress.show();
}
@Override
protected EditText doInBackground(File... files) {
EditText newEditText = new EditText(Activity.this);
newEditText.setText(readFile());
return newEditText;
}
@Override
protected void onPostExecute(EditText editText) {
//get rid of old for the new
ViewGroup.LayoutParams oldLayoutParams = dummyEditTextForShow.getLayoutParams();
viewGroupToAddEditTextTo.removeView(dummyEditTextForShow);
viewGroupToAddEditTextTo.addView(editText, indexOfDummy, oldLayoutParams));
progress.hide();
dummyEditTextForShow = editText
}
}
}
我使用a测试了上面的内容http://www.webpagefx.com/tools/lorem-ipsum-generator/loremipsum/paragraphs http://www.webpagefx.com/tools/lorem-ipsum-generator/loremipsum/paragraphs段落数:100
大小:46929 字节
设置为一个字符串值fiftykb
然后创建另一个字符串all
非常懒惰地将其设置为新的编辑文本(而不是您的readFile()
):
String all = fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb + fiftykb;
newEditText.setText(all)
结果是动画永远不会停止,但有一个短暂的时刻(
HTHs!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)