Java DialogFragment(支持v4)使应用程序(NPE)崩溃
我已经检查了很多关于StackOverflow的问题,但是我没有找到任何解决问题的方法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
在一个
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
干扰了活动。看来我今天很幸运。。。我用新的有用信息编辑了我的代码。这个能帮你吗?