Java DialogFragment(支持v4)使应用程序(NPE)崩溃

Java DialogFragment(支持v4)使应用程序(NPE)崩溃,java,android,android-dialogfragment,dialogfragment,Java,Android,Android Dialogfragment,Dialogfragment,我已经检查了很多关于StackOverflow的问题,但是我没有找到任何解决问题的方法 在一个DialogFragment中,我调用了一个AsyncTask方法,当从服务器收到结果时,我启动了另一个DialogFragment 下面是我用来启动对话框片段的代码: public class RequesterConfirmRent extends DialogFragment { // Called from onPostExecute() in AsyncTask class. public

我已经检查了很多关于StackOverflow的问题,但是我没有找到任何解决问题的方法
在一个
DialogFragment
中,我调用了一个
AsyncTask
方法,当从服务器收到结果时,我启动了另一个
DialogFragment

下面是我用来启动对话框片段的代码:

public class RequesterConfirmRent extends DialogFragment {

// Called from onPostExecute() in AsyncTask class.
public void onPostComputeAmountToPay(JSONArray array){
        double amountToPay = 0.0;
        String ownerName = "";
        try{
            if(!array.getJSONObject(0).getBoolean("success"))
                Log.e("Error", "Error with JSON received");
            else {
                amountToPay = array.getJSONObject(1).getDouble("amountToPay");
                ownerName   = array.getJSONObject(2).getString("ownerName");
            }
        }catch(JSONException e){
            Log.e(e.getClass().getName(), "JSONException", e);
        }

        // Create and show the DialogFragment
        Paiement p = new Paiement();
        Bundle bdl = new Bundle();
        bdl.putString("ownerName", ownerName);
        bdl.putDouble("amountToPay", amountToPay);
        p.setArguments(bdl);

        // Buggy line (NPE)
        p.show(getFragmentManager(), "4554");
    }
}
下面是我试图显示的DialogFragment的代码:

public class Paiement extends DialogFragment {

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        if(getDialog() == null)
            super.setShowsDialog(false);
        Dialog dialog =  super.onCreateDialog(savedInstanceState);
        dialog.setTitle("Synthesis of your rent");
        return dialog;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_paiement, container, false);
        init(rootView);
        return rootView;
    }

   private void init(View v){// Bla bla ...}
}
当我调用
.show()
方法时,我总是得到一个NullPointerException

我做错了什么

非常感谢你的帮助

编辑1:根据要求,这里是日志猫

05-11 09:58:34.470 31384-31384/com.example.celien.drivemycar E/AndroidRuntime﹕ 致命异常:主 java.lang.NullPointerException 位于android.support.v4.app.DialogFragment.show(DialogFragment.java:136) 位于com.example.celien.drivemycar.fragment.RequesterConfirmRent.onpostcomputeamountpay(RequesterConfirmRent.java:148)

编辑2我这样修改了代码,getFragmentManager()似乎为空。为什么?

        Paiement p = new Paiement();
        Bundle bdl = new Bundle();
        bdl.putString("ownerName", ownerName);
        bdl.putDouble("amountToPay", amountToPay);
        p.setArguments(bdl);
        // BUGGY LINE
        android.support.v4.app.FragmentManager f = getFragmentManager();
        if(p == null)
            Log.d("Exception ", "p is null");
        if(f == null)
            Log.d("Exception ", "f is null");

        try {
            p.show(f, "4554");
        }catch(NullPointerException e){
            Log.d("Exception  ", e.toString());
        }
编辑3: 有一些新的信息
为了避免创建此对话框,我在
Toast
中显示数据:
Toast.makeText(this.getActivity(),“您必须支付”+amountToPay+“e到”+ownerName,Toast.LENGTH\u LONG).show()并获得NPE
但是如果我使用日志系统,一切都很好:

Log.d("Rcvd ", String.valueOf(amountToPay));
Log.d("Rcvd ", ownerName);

那么,为什么我的活动是空的?

如果在调用
p.show()
而不是
p.setArguments()
时得到了NPE,可能是
p
可以,但
show
调用中的某些内容不可以

可能需要解决的一点是,您正在使用支持版本的
FragmentManager
,并使用
getFragmentManager()
调用。请尝试使用
getSupportFragmentManager()
。当需要时,它将返回到适当的位置。 另一方面,您正在调用
android.support.v4.app.FragmentManager
。如果手动添加包,这很奇怪,所以很可能是IDE为您完成的。您可以尝试删除
FragmentManager
后面的包,并希望代码符合不支持的标准框架。可能只有对支持库的引用完成了,因此删除包部件可以解决问题

我的建议:在应用程序中,定义活动和片段时,始终坚持使用标准框架或支持库。因此,请确保您创建的每个
活动和
片段都扩展了适当的支持(或标准框架)版本。混合使用它们将导致意外的崩溃


另外,正如我在一篇评论中提到的,
AsyncTask
即使在您的片段被分离后也可以自由运行,因此此片段不再正确引用任何活动。告诉您通过查看
isDetached()
检查片段是否已分离。检查他的答案。他说的是使用
Loader
s而不是
AsyncTask
s,或者将
AsyncTask
向上移动到活动中,以便活动始终可用。展望未来,
Loader
是最好的选择(因为这是
AsyncTask
的自然进化),看看现在,试着将
AsyncTask
移动到常见的活动上。

NullPointerException
你说呢?发布logcat您应该…DialogFragment调用的DialogFragment听起来不是一个好主意。我猜
p
为null…您确定getFragmentManager()不为null吗?让我检查所有这些。我用LogCat更新了这个问题:),所以我调用supportFragmentManager():
FragmentManager f=getActivity().getSupportFragmentManager()
导入android.support.v4.app.FragmentManager。但是在创建f时得到了NPE。只要你使用v4版本的Fragment、FragmentManager、FragmentTransaction等等,是的。你应该注意这一点。否则,您可能会发现该应用程序在某些Android设备上无法正常工作。希望在部署之前,代码会因此而崩溃,但最好确保您在整个应用程序中使用支持库。谢谢您的建议!但是不知道该怎么做才能修复它?@Mornor我很确定,如果它不能解决它(引用具有相同问题的人,认真地说,在任何地方都使用
Support
infix,并扩展活动和片段的支持版本),很可能是
AsyncTask
干扰了活动。看来我今天很幸运。。。我用新的有用信息编辑了我的代码。这个能帮你吗?