在第一个 运行 之后,ProgressDialog 在片段中崩溃
ProgressDialog crash in fragment after first run
首先我不得不说我已经阅读了一些关于这个问题的帖子,但没有人解决我的问题。
在应用程序的第一个 运行 上,启动了一个简介 activity 以请求一些数据:
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;
}
});
当它 returns 在介绍之后,导航抽屉第一次显示为文档状态并加载默认片段。
此片段显示介绍中介绍的信息,例如 phone 号码。在此片段中,我可以根据需要更改此数字。如果我这样做,我会在后台作业完成时显示一个进度对话框。
但是问题来了。在第一个 运行 上,我不太明白为什么会这样,但是当应该显示 Progress 对话框时,应用程序崩溃并在 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?
在此之后,我再次 运行 应用程序。这次没有显示介绍,也没有显示导航抽屉(这只发生在第一个 运行 上),如果我再次尝试编辑 phone 编号,则会显示进度对话框并且一切正常.
这就是我在片段中启动 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。我不知道。
我认为您在 activity 中创建了一个片段,然后在显示对话框之前对其调用了 finish()
。尽量不要在 if (!isIntroShown())
语句中调用 finish()
。
从 intro/tutorial 您可以 return 到稍后创建的相同 activity 而无需首先杀死它。
当您为不再存在的上下文显示对话框时可能会发生这种情况,因此何时尝试初始化您的 ProgressDialog
检查 Activity 是否为 运行。
if(!((Activity) getActivity()).isFinishing()){
progressDialog = new ProgressDialog(getActivity());
}
首先我不得不说我已经阅读了一些关于这个问题的帖子,但没有人解决我的问题。
在应用程序的第一个 运行 上,启动了一个简介 activity 以请求一些数据:
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;
}
});
当它 returns 在介绍之后,导航抽屉第一次显示为文档状态并加载默认片段。
此片段显示介绍中介绍的信息,例如 phone 号码。在此片段中,我可以根据需要更改此数字。如果我这样做,我会在后台作业完成时显示一个进度对话框。
但是问题来了。在第一个 运行 上,我不太明白为什么会这样,但是当应该显示 Progress 对话框时,应用程序崩溃并在 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?
在此之后,我再次 运行 应用程序。这次没有显示介绍,也没有显示导航抽屉(这只发生在第一个 运行 上),如果我再次尝试编辑 phone 编号,则会显示进度对话框并且一切正常.
这就是我在片段中启动 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。我不知道。
我认为您在 activity 中创建了一个片段,然后在显示对话框之前对其调用了 finish()
。尽量不要在 if (!isIntroShown())
语句中调用 finish()
。
从 intro/tutorial 您可以 return 到稍后创建的相同 activity 而无需首先杀死它。
当您为不再存在的上下文显示对话框时可能会发生这种情况,因此何时尝试初始化您的 ProgressDialog
检查 Activity 是否为 运行。
if(!((Activity) getActivity()).isFinishing()){
progressDialog = new ProgressDialog(getActivity());
}