一个愚蠢的问题,但我真的无法让它工作:我在Swing应用程序中有一些长时间运行的过程可能需要几分钟.我希望在此过程正在进行时向用户显示进度对话框.我还想阻止用户执行进一步的操作,例如在进行过程中按下按钮.
如果我在EDT上执行此过程,这显然会阻止最终用户在进程中执行任何操作.但是因为EDT正在忙于处理,所以它永远无法渲染对话框的内容,因此我只是得到了对话框的轮廓.
但是如果我在工作线程中执行该过程,最终用户可以单击按钮并使EDT操纵工作者同时也在操作的状态,结果是坏事.如果我创建对话框模态,那不会发生,但Swing中的模态也意味着阻塞,所以在我调用的那一刻setVisible(true),线程永远阻塞.
所以我当前的"解决方案"是使用一个工作线程,然后产生一个单独的线程,其唯一目的是吸收阻塞性质setVisible.肯定有一个更好的解决方案!
那么我如何得到一个对话框,阻止用户与系统的其余部分(模态)交互,但不阻止导致它可见的线程?
我想让虚拟进度对话框出现2或3秒钟.除了说检测之外,它实际上不会做任何事情.我有代码:
ProgressDialog dialog = ProgressDialog.show(this, "", "Detecting...",
true);
dialog.show();
dialog.dismiss();
Run Code Online (Sandbox Code Playgroud)
但是我在演出和解雇之间放置了什么让对话框显示几秒钟?谢谢!
我正在尝试在轮询我的服务器时打开一个进度对话框.该类是一个ActivityGroup,因为它嵌套在选项卡栏中.要在框架内保持视图,需要ActivityGroup.这是我的ActivityGroup类的声明:
public class CheckInActivity extends ActivityGroup{
...
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.checkin);
new LocationControl().execute(this);
Run Code Online (Sandbox Code Playgroud)
现在我的AsyncTask类在同一个CheckInActivityClass中:
private class LocationControl extends AsyncTask<Context, Void, Void>
{
private final ProgressDialog dialog = new ProgressDialog(CheckInActivity.this);
protected void onPreExecute()
{
this.dialog.setMessage("Determining your location...");
this.dialog.show();
}
Run Code Online (Sandbox Code Playgroud)
当我运行给定的应用程序时,它通过与WindowManager $ BadTokenException相关的错误.说明它无法使用未知令牌启动窗口.我尝试制作一个只是常规Activity(而不是ActivityGroup)的示例应用程序,它运行得很好.
有没有人知道如何修改它以使其工作,或解决方法将允许进度条嵌套在选项卡栏中?任何帮助是极大的赞赏.
我创建了一个自定义加载进度对话框.而且运作良好.
我正在旋转12平方图像这里是其中之一

但是,当我想与AsynTask一起使用时,动画无效.
我的示例代码如下.
我开始加载的活动...动画和停止.
MainActivity.java
public class MainActivity extends Activity {
AnimationDrawable loadingViewAnim;
TextView loadigText;
ImageView loadigIcon;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadigText = (TextView) findViewById(R.id.textView1);
loadigText.setText("Loading...");
loadigText.setVisibility(View.GONE);
loadigIcon = (ImageView) findViewById(R.id.imageView1);
loadigIcon.setVisibility(View.GONE);
loadigIcon.setBackgroundResource(R.anim.progress_animation_white);
loadingViewAnim = (AnimationDrawable) loadigIcon.getBackground();
}
//When User Touch on Screen The Loading... Animation Starts With Image Rotation
//If I start below code in AsynTask's onPreExecute method it doesn't work
public boolean onTouchEvent(MotionEvent event)
{
loadigText.setVisibility(View.VISIBLE);
loadigIcon.setVisibility(View.VISIBLE);
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
loadingViewAnim.start(); …Run Code Online (Sandbox Code Playgroud) 是否可以更改ProgressBar样式的进度对话框.如果是,那我该怎么办呢?
这是我的场景:我有一个登录屏幕,可以打开另一个活动.在活动中,我只需:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
}
Run Code Online (Sandbox Code Playgroud)
布局有点沉重,因为它是由一些碎片组成的,并且需要大约1.5秒才能加载.现在,我如何显示一段ProgressDialog时间setContentView完成布局?我已经尝试AsyncTask过将其setContentView放入doInBackground,但当然无法完成,因为UI只能从UI线程更新.所以我需要setContentView在UI线程中调用,但是我必须在哪里显示/关闭ProgressDialog?
我感谢您的帮助.
弗拉.
编辑:我跟着@ JohnBoker先前的建议,这是我现在的代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_empty_layout);
new ContentSetterTask().execute("");
}
private class ContentSetterTask extends AsyncTask<String, Void, Void> {
public ProgressDialog prgDlg;
@Override
protected void onPreExecute() {
android.os.Debug.waitForDebugger();
prgDlg = ProgressDialog.show(MultiPaneActivity.this, "", "Loading...", true);
}
@Override
protected Void doInBackground(String... args) {
android.os.Debug.waitForDebugger();
ViewGroup rootView = (ViewGroup)findViewById(R.id.emptyLayout);
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View inflated …Run Code Online (Sandbox Code Playgroud) multithreading android progressdialog android-asynctask android-activity
我有个问题.我需要从一个活动转到另一个活动.我的第二个活动有一个很大的xml布局,有很多元素(我说的是大约四百个aprox.),然后需要几秒钟(太多)才能显示第二个Activity.
如何在两个活动之间显示"进度"对话框?
我正在尝试使用后台任务来执行此操作.
我的活动A中有这个方法:
private void goToYear() {
Intent intent = new Intent();
intent.setClass (getBaseContext(), YearActivity.class);
startActivity( intent);
}
Run Code Online (Sandbox Code Playgroud)
在我的活动B中:
public class YearActivity extends Activity {
private String TAG = "YearActivity ::";
private ProgressDialog pd = null;
@Override
public void onCreate( Bundle savedInstanceState) {
super.onCreate( savedInstanceState);
// Show the ProgressDialog on this thread
this.pd = ProgressDialog.show(this, "Working...", "Calculating the screen...", true, false);
// Start a new thread that will download all the data
new MakeYearTask().execute();
}
private void initCalendar () …Run Code Online (Sandbox Code Playgroud) 可能重复:
透明,无边框ProgressDialog
我Theme.Light在我的应用程序中使用.使用时Progress Dialog,对话框颜色的文字是黑色的,这并不令人鼓舞.
我尝试了这个仅更改对话框的文本颜色,但没有用:
<style name="Theme.MyDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:textColor">#FFFFFF</item>
</style>
Run Code Online (Sandbox Code Playgroud)
我是否必须在任何XML中设置样式(MyDialog)?或者我如何更改对话框的文本颜色?
提前致谢.
我有一个备份例程,可以将所有内容从一个文件夹复制到外部SD卡,完美无缺.我正在尝试获得一个很好的弹出对话框,显示它正在运行但它没有显示.甚至没有尝试运行(但备份确实完成).
这是我目前的代码:
public void doBackup(View view) throws IOException{
ProgressDialog pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("Running backup. Do not unplug drive");
pd.setIndeterminate(true);
pd.setCancelable(false);
pd.show();
File source = new File("/mnt/extSdCard/DirectEnquiries");
File dest = new File("/mnt/UsbDriveA/Backup");
copyDirectory(source, dest);
pd.dismiss();
}
Run Code Online (Sandbox Code Playgroud) 由于ProgressDialog已从Android版本O弃用,我仍然找到了更好的方法来完成我的任务.任务是从我的活动转移到片段.一切都工作正常,但progressdialog不可见.我试过实现它但是... progressdialog不起作用.
似乎进度条可以工作但仍然不起作用.我需要一个progressdialog,因为我很容易设置我的标题和消息.我需要一个微调器progressDialog但不知道该怎么做.这是我的一项工作,但没有实施:
Java类
ublic class SaveVideo extends AppCompatActivity {
private Button button;
private ProgressDialog mProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_save_video);
mProgressDialog = new ProgressDialog(this);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.back);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
button = (Button) findViewById(R.id.saveVideo);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//where it must be seen when the button is pressed
mProgressDialog.setTitle("Title");
mProgressDialog.setMessage("Message");
mProgressDialog.show();
Intent intent = new Intent(SaveVideo.this,MainActivity.class);
intent.putExtra("change",2);
startActivity(intent);
//as soon as the page moves from this to another fragment
mProgressDialog.dismiss();
}
});
} …Run Code Online (Sandbox Code Playgroud) progressdialog ×10
android ×9
animation ×1
coding-style ×1
delay ×1
modal-dialog ×1
nonblocking ×1
progress-bar ×1
swing ×1