Android 第一次运行后ProgressDialog在片段中崩溃
首先,我必须说,我读过一些关于这个问题的帖子,但是没有人解决我的问题 应用程序第一次运行时,会启动一个介绍活动以请求一些数据:Android 第一次运行后ProgressDialog在片段中崩溃,android,android-fragments,progressdialog,Android,Android Fragments,Progressdialog,首先,我必须说,我读过一些关于这个问题的帖子,但是没有人解决我的问题 应用程序第一次运行时,会启动一个介绍活动以请求一些数据: public class MainActivity extends AppCompatActivity{ ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); se
public class MainActivity extends AppCompatActivity{
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
...
//If first run, an intro is shown
if (!isIntroShown()) {
Intent intent = new Intent(MainActivity.this, IntroWellcomeActivity.class);
startActivity(intent);
setIntroShown(true);
finish();
}
//Navigation drawer set up
drawerLayout.setDrawerListener(this);
setUpToolbar();
setUpNavDrawer();
displayFragment(R.id.navigation_item_1);
navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(true);
displayFragment(menuItem.getItemId());
drawerLayout.closeDrawers();
return true;
}
});
当它在简介之后返回时,导航抽屉将第一次显示为文档状态,并加载默认片段
此片段显示介绍中介绍的信息,例如电话号码。在这个片段中,如果我愿意,我可以更改这个数字。如果我这样做,我会在后台工作完成时显示一个进度对话框
但问题来了。在第一次运行时,我不太明白为什么会发生这种情况,但是当显示进度对话框时,应用程序会崩溃,并在logCat上显示这种情况
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myapp, PID: 31388
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@55b185f is not valid; is your activity running?
之后,我再次运行该应用程序。这次没有显示介绍,也没有显示导航抽屉(这只发生在第一次运行时),如果我再次尝试编辑电话号码,将显示进度对话框,一切正常
以下是我在片段中启动ProgressDialog的方式:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_profile, container, false);
...
progressDialog = new ProgressDialog(getContext());
我尝试使用getActivity()而不是getContext(),但没有解决问题
因此,我猜在显示介绍并加载片段后的第一次运行中,有些东西没有启动,或者我在错误的位置启动progressDialog。我不知道。我认为在显示对话框之前,您在调用
finish()
的活动中创建了一个片段。如果(!isIntroShown())语句,请尝试不要在中调用finish()
从简介/教程中,您可以稍后返回到相同的已创建活动,而不必首先终止它。当您为不再存在的上下文显示对话框时,可能会发生这种情况,因此在尝试初始化进度对话框时,请检查活动是否正在运行
if(!((Activity) getActivity()).isFinishing()){
progressDialog = new ProgressDialog(getActivity());
}
使用getActivity()初始化ProgressDialog,并在显示进度对话框时尝试(!getActivity().isFinishing()){ProgressDialog.show()),同时检查ProgressDialog是否已经显示。如果是,请关闭并重新初始化它。是否可以尝试在ProgressDialog构造函数中传递此参数:getActivity().getApplicationContext()我在其他帖子上看到过这一点,但这不是我需要的。无论如何都必须启动ProgressDialog。当没有活动的上下文时,如何启动进度对话框?谢谢!这就是有效的方法!我知道它应该是这样的。