mNewSimUnlockProgressDialog = new ProgressDialog(mContext); String msg = mContext.getString(R.string.kg_sim_unlock_progress_dialog_message); mNewSimUnlockProgressDialog.setMessage(msg); mNewSimUnlockProgressDialog.setIndeterminate(true); mNewSimUnlockProgressDialog.setCancelable(false); if (!(mContext instanceof Activity)) { mNewSimUnlockProgressDialog.getWindow().setType( WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); }这个dialog里面的if语句中的代码有什么作用
时间: 2024-02-14 13:19:30 浏览: 78
这段if语句中的代码用于设置ProgressDialog的窗口类型。如果当前的Context不是Activity,即当前的上下文环境不是一个活动(Activity),则通过设置ProgressDialog的窗口类型为WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG来使ProgressDialog能够显示在锁屏界面之上。这样可以保证用户在解锁SIM卡时,能够看到ProgressDialog的提示信息,而不会被锁屏界面覆盖。如果当前的Context是Activity,则无需设置窗口类型。
相关问题
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@3854e45 is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:1414) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:408) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) at android.app.Dialog.show(Dialog.java:361) at android.app.ProgressDialog.show(ProgressDialog.java:190) at android.app.ProgressDialog.show(ProgressDialog.java:147) at com.example.spnclient.DeviceHistoryActivity.getHistoryInfo(DeviceHistoryActivity.java:116) at com.example.spnclient.DeviceHistoryActivity.lambda$onCreate$0$DeviceHistoryActivity(DeviceHistoryActivity.java:109) at com.example.spnclient.-$$Lambda$DeviceHistoryActivity$DsxYKdi-splpEv-okxWR_g3VSRM.run(Unknown Source:2) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:210) at android.os.Looper.loop(Looper.java:299) at android.app.ActivityThread.main(ActivityThread.java:8130) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1028)
这个错误通常是由于Activity已经被销毁,而ProgressDialog仍在尝试显示,因此无法添加窗口。解决方法是在ProgressDialog显示之前检查Activity是否仍在运行。你可以使用以下代码来解决这个问题:
```
if (!isFinishing()) {
ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
progressDialog.show();
}
```
这个代码片段检查Activity是否已经被销毁,如果Activity仍在运行,则显示ProgressDialog。如果Activity已经被销毁,则不会显示ProgressDialog,从而避免了BadTokenException的出现。
另外,ProgressDialog已经被标记为过时,推荐使用ProgressBar或其他更现代化的替代品。
FileSystemView fileSystemView=FileSystemView.getFileSystemView(); File tempFile; if (filepath==null||filepath.isEmpty()||filepath.equals("")) { tempFile=fileSystemView.getHomeDirectory(); }else { tempFile=new File(filepath); } JFileChooser chooser = new JFileChooser(tempFile); //设置选择器 chooser.setMultiSelectionEnabled(true); //设为多选 chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);//设置可选择的为文件和文件夹 chooser.addChoosableFileFilter(new javax.swing.filechooser.FileFilter() { @Override public String getDescription() { // TODO Auto-generated method stub return ".xml"; } @Override public boolean accept(File f) { // TODO Auto-generated method stub if (f.getName().toLowerCase().endsWith(".xml")) { return true; } return false; } }); chooser.setDialogTitle("请选择需要修改的文件"); chooser.setPreferredSize(new Dimension(800,1000)); chooser.getActionMap().get("viewTypeDetails").actionPerformed(null); chooser.showOpenDialog(button); //显示打开文件选择框 filepath = chooser.getSelectedFile().getAbsolutePath(); //获取绝对路径 button.setText(filepath); if (chooser.isFileSelectionEnabled()) { new MyJOptionPane("目前仅支持修改xml格式文件,请选择正确的格式"); } if(chooser.isDirectorySelectionEnabled()) { progressBar.setIndeterminate(true); progressBar.setStringPainted(false); progressDialog.setVisible(true); Thread thread=new Thread(() -> { try { XmlHanding.getMyFlie(new File(filepath)); text.setText("已选择文件夹:"+filepath); text.append("\n"+"文件包含"+XmlHanding.fList.size()+"个xml文件"); for(File f:XmlHanding.fList){ text1.append("\n"+f.getAbsolutePath()); } text1.setCaretPosition(0); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); }finally { // 执行完毕后关闭进度对话框 progressDialog.dispose(); } }); thread.start(); } }为什么选择了单个的文件 text还是会写入"已选择文件夹:"+filepath
在你的代码中,当选择了单个文件时,`chooser.isDirectorySelectionEnabled()` 仍然返回 `true`,导致 `text` 文本区域会显示 "已选择文件夹:"+filepath。这是因为在选择文件时,JFileChooser 仍然允许选择文件夹,所以 `chooser.isDirectorySelectionEnabled()` 返回的是选择模式而不是实际选择的类型。
要解决这个问题,你可以在选择单个文件时,检查选择的是文件还是文件夹。以下是修改后的代码:
```java
FileSystemView fileSystemView = FileSystemView.getFileSystemView();
File tempFile;
if (filepath == null || filepath.isEmpty() || filepath.equals("")) {
tempFile = fileSystemView.getHomeDirectory();
} else {
tempFile = new File(filepath);
}
JFileChooser chooser = new JFileChooser(tempFile);
chooser.setMultiSelectionEnabled(true);
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
chooser.addChoosableFileFilter(new javax.swing.filechooser.FileFilter() {
@Override
public String getDescription() {
return ".xml";
}
@Override
public boolean accept(File f) {
if (f.getName().toLowerCase().endsWith(".xml")) {
return true;
}
return false;
}
});
chooser.setDialogTitle("请选择需要修改的文件");
chooser.setPreferredSize(new Dimension(800, 1000));
chooser.getActionMap().get("viewTypeDetails").actionPerformed(null);
int result = chooser.showOpenDialog(button);
if (result == JFileChooser.APPROVE_OPTION) {
File[] selectedFiles = chooser.getSelectedFiles();
if (selectedFiles.length == 1 && selectedFiles[0].isFile()) {
// 单个文件被选择
filepath = selectedFiles[0].getAbsolutePath();
button.setText(filepath);
text.setText("已选择文件:" + filepath);
text.append("\n" + "文件包含 1 个xml文件");
text1.setText(selectedFiles[0].getAbsolutePath());
} else if (selectedFiles.length > 1 || (selectedFiles.length == 1 && selectedFiles[0].isDirectory())) {
// 多个文件或文件夹被选择
filepath = selectedFiles[0].getAbsolutePath();
button.setText(filepath);
text.setText("已选择文件夹:" + filepath);
text.append("\n" + "文件包含 " + selectedFiles.length + " 个xml文件");
for (File f : selectedFiles) {
text1.append("\n" + f.getAbsolutePath());
}
text1.setCaretPosition(0);
}
}
```
在修改后的代码中,我们首先获取用户选择的文件数组 `selectedFiles`,然后根据数组的长度和元素类型判断用户选择的是单个文件还是多个文件/文件夹。根据判断结果,我们相应地更新 `text` 和 `text1` 的文本内容。
阅读全文