Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 第一次运行后ProgressDialog在片段中崩溃_Android_Android Fragments_Progressdialog - Fatal编程技术网

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。当没有活动的
上下文时,如何启动进度对话框?谢谢!这就是有效的方法!我知道它应该是这样的。