首先,我必须说我已经阅读了一些有关此问题的帖子,但没有人解决我的问题。
在第一次运行应用程序时,会启动一个介绍活动来请求一些数据:
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。我不知道。
答案 0 :(得分:1)
我认为您在显示对话框之前在其中调用finish()
的活动中创建了一个片段。尽量不要在finish()
声明中致电if (!isIntroShown())
。
从intro / tutorial开始,您可以稍后返回相同的已创建活动,而不会首先将其删除。
答案 1 :(得分:0)
当您显示不再存在的上下文的对话框时会发生这种情况,因此何时尝试初始化ProgressDialog
检查Activity是否正在运行。
if(!((Activity) getActivity()).isFinishing()){
progressDialog = new ProgressDialog(getActivity());
}