AlertDialogs Android中的上下文问题

时间:2018-12-29 21:17:39

标签: android android-fragments

我的应用程序有问题。

在一切之前,对不起我的英语不好。

我有一个MainActivity,其中包含五个片段和一类函数(FunctionsApp)。

在其中一个片段中,找到了“ OptionsFragment”,该片段具有用于转到“设置”,“注销”和其他选项的按钮。

问题是当我在片段(OptionsFragment)中选择返回到其他“活动”的按钮后(在完成相应操作后),在片段OptionsFragment中选择了“注销”按钮,该按钮称为 FunctionsApp ,并显示一个AlertDialog。

显示的错误:

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@e363980 is not valid; is your activity running?

代码:

OptionsFragment:

package com.kevin.app.activities;

import...

public class OptionsFragment extends Fragment implements NavigationView.OnNavigationItemSelectedListener {

    FunctionsApp functionsapp = new FunctionsApp(getActivity());

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View vista=inflater.inflate(R.layout.fragment_options, container, false);

        NavigationView navigationView = (NavigationView)vista.findViewById(R.id.nav_options_view);
        navigationView.setNavigationItemSelectedListener(this);

        return vista;
    }

    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_options_logout) {
            functionsapp.logoutAsk();
        } else if (id == R.id.nav_options_settings) {
            functionsapp.goSettingsActivity();
        }
        return true;
    }

}

FunctionsApp:

    package com.kevin.app.aplicacion;

    import..

    public class FunctionsApp {

    private static Context context;
    public FunctionsApp(Context context) {
        this.context = context;
    }

// logout
    public void logoutAsk() {
        new AlertDialog.Builder(context)
                .setMessage(R.string.message_logout_confirm)
                .setCancelable(true)
                .setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        registerLogout();
                        cleanAllSP();
                        showToast(context.getString(R.string.message_logout_yes));
                        goWelcomeActivity();
                    }
                })
                .setNegativeButton(R.string.text_nope, null)
                .show();
    }

可以帮我吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我相信这里正在发生的事情是该活动正在进行销毁阶段(当您单击“后退”按钮时),并且当后台线程完成时,它便开始工作并尝试显示您希望的对话。因此,要纠正此问题,您只需要在实际显示该对话之前检查您的活动是否正在完成阶段即可。

请执行以下操作:

if(!((FunctionsApp)context).isFinishing()){
    new AlertDialog.Builder(context)
                .setMessage(R.string.message_logout_confirm)
                .setCancelable(true)
                .setPositiveButton(R.string.text_yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        registerLogout();
                        cleanAllSP();
                        showToast(context.getString(R.string.message_logout_yes));
                        goWelcomeActivity();
                    }
                })
                .setNegativeButton(R.string.text_nope, null)
                .show();
}