未能传递结果ResultInfo{who=null,request=1,result=-1,data=Intent{dat=content://com.android.contacts/contacts/lookup...}}
我正在尝试从联系人列表中选择联系人并将其添加到数据库中。但是,每当我在onActivityResult中选择联系人和流程数据时,它都会引发以下异常:未能传递结果ResultInfo{who=null,request=1,result=-1,data=Intent{dat=content://com.android.contacts/contacts/lookup...}},android,actionbarsherlock,android-tabhost,onactivityresult,android-nested-fragment,Android,Actionbarsherlock,Android Tabhost,Onactivityresult,Android Nested Fragment,我正在尝试从联系人列表中选择联系人并将其添加到数据库中。但是,每当我在onActivityResult中选择联系人和流程数据时,它都会引发以下异常: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/80i23a826b40
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/80i23a826b40e879ef2/314 flg=0x1 }} to activity {com.example.MyApplication/com.example.MyApplication.MainActivity}: java.lang.NullPointerException
Caused by: java.lang.NullPointerException at com.example.myapplication.ChildTab1.onActivityResult(ChildTab1.java:92)
单击“添加联系人”按钮(在ChildTab2
class中):
onActivityResult方法(在ChildTab2
Class中):
在我的应用程序中,我实现了ActionBarShelock
。所以,有三个选项卡(扩展SherlockFragment),在第二个选项卡中包含另外两个选项卡(也扩展了SherlockFragment)。因此,我将onActivityResult值从main activity
传递到FragmentTab2
到ChildTab1
的onActivityResult方法,如下所示:
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
new FragmentTab2().onActivityResult(requestCode, resultCode, intent);
}
创建前三个选项卡的代码(在MainActivity
class中):
以及创建子选项卡的代码(在FragmentTab2
class中):
最可能的问题是:
new FragmentTab2().onActivityResult(requestCode, resultCode, intent);
您正在创建一个新实例,而不是在现有实例上调用该方法。将片段
实例保存在一个成员变量中,并在执行空检查后调用此实例上的方法
您的第二个错误是NullPointerException
,发生在以下位置:
Cursor c = getActivity().getContentResolver().query(contactData, null, null, null, null);
很可能是由同一件事引起的。由于您创建了一个新的片段
实例,该实例未附加到任何活动
中,因此方法getActivity
将返回null
因此,基本上要修复这两个错误,只需对附加到活动的现有片段实例调用onActivityResult(…)
方法。它应该是这样的:
private FragmentTab2 fragmentTab2; // Save the instance in this variable
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if(fragmentTab2 != null) {
fragmentTab2.onActivityResult(requestCode, resultCode, intent);
}
}
private FragmentTab2 fragmentTab2;
private SomeOtherFragment someOtherFragment;
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
// For each of your Fragments add an if statement here checking for
// the class of the Fragment and assign if it to the member variables
// if a match is found
if (fragment instanceof FragmentTab2) {
this.fragmentTab2 = (FragmentTab2) fragment;
} else if(fragment instanceof SomeOtherFragment) {
this.someOtherFragment = (SomeOtherFragment) fragment;
} else ...
}
编辑:
要获取片段
实例,您必须在活动
中覆盖片段()
,如下所示:
private FragmentTab2 fragmentTab2; // Save the instance in this variable
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if(fragmentTab2 != null) {
fragmentTab2.onActivityResult(requestCode, resultCode, intent);
}
}
private FragmentTab2 fragmentTab2;
private SomeOtherFragment someOtherFragment;
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
// For each of your Fragments add an if statement here checking for
// the class of the Fragment and assign if it to the member variables
// if a match is found
if (fragment instanceof FragmentTab2) {
this.fragmentTab2 = (FragmentTab2) fragment;
} else if(fragment instanceof SomeOtherFragment) {
this.someOtherFragment = (SomeOtherFragment) fragment;
} else ...
}
使用这种方法,每当您想在实例上调用方法时,空检查就更加重要,因此不要忘记始终检查片段
是否为空 您在这里试图做什么:newfragmenttab2().onActivityResult(请求代码、结果代码、意图)代码>?另外,请张贴更多的日志。这一行没有多大帮助,我们需要看更多的内容来确定错误的来源。在ChildTab1
中没有调用onActivityResult
方法,但它调用了MainActivity
的onActivityResult方法,因此,我将值从MainActivity
传递给它的子FragmentTab2
传递给它的子ChildTab1
。我正在调用activityresult(requestCode、resultCode、intent)上的new ChildTab1()
在FragmentTab2
的onActivityResult
方法中。但您不向FragmentTab2
传递任何值,您只需创建一个FragmentTab2
的新实例,并对其调用一个方法,然后该新实例将立即被垃圾收集并再次销毁。如果要将值传递给现有实例,则必须对现有实例调用此方法。不过,请发布更多相关代码和更多日志。如果没有这些,我们只能猜测问题出在哪里。哎呀,我没有注意到我每次都在创建新实例。愚蠢的错误。:)而且,日志还有一件事,我忘了添加。现在,我已经添加了它。它在以下行抛出NullPointerException:游标c=getActivity().getContentResolver().query(contactData,null,null,null,null)这很可能是因为您每次都创建了一个新实例。如果您创建一个片段的新实例
,它不会立即附加到任何活动
,因此getActivity()
将返回null并导致此NullPointerException
。感谢您的回答。但是,有了它,我只能得到FragmentTab2
的实例,而不能得到ChildTab2
的实例,它包含我想要运行的onActivityResult
方法。而且,FragmentTab2
类(扩展了SherlockFragment)中没有OnAtachFragment
方法,因此即使在FragmentTab2
类中,我也无法获得ChildTab2
的实例。您为什么想要ChildTab2
的实例?您并没有发布太多的代码,所以我无法确定您的体系结构是什么,但这看起来肯定是一个糟糕的设计。如果它是FragmentTab2
的子标记,那么它应该与活动无关。在FragmentTab2
上调用一个方法并将其传递给子级是正确的方法。体系结构如下:MainActivity
创建三个选项卡FragmentTab1,2,3
,它们扩展了SherlockFragment
。在FragmentTab2
class i中创建两个子选项卡ChildTab1,2
,该选项卡还扩展了SherlockFragment
。我已经添加了用于创建所有这些选项卡的代码。另外,现在我已经编辑了代码,以显示哪些代码在哪个类中,以避免任何混淆。我想调用的onActivityResult
方法位于ChildTab2
中。但是,每当结果出现时,它都会调用onActivityResult
方法main activity
而不是ChildTab2
。问题现在解决了,谢谢您的帮助。:)要获得ChildTab2,我必须使用FragmentTab2
的getChildFragmentManager
方法。因此,在main活动的onActivityResult
方法中的最后一个代码是:Fragment childTab2=fragmentTab2.getChildFragmentManager().findffragmentbytag(“childTab2”);childTab2.onActivityResult(请求代码、结果代码、意图)代码>
private FragmentTab2 fragmentTab2; // Save the instance in this variable
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if(fragmentTab2 != null) {
fragmentTab2.onActivityResult(requestCode, resultCode, intent);
}
}
private FragmentTab2 fragmentTab2;
private SomeOtherFragment someOtherFragment;
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
// For each of your Fragments add an if statement here checking for
// the class of the Fragment and assign if it to the member variables
// if a match is found
if (fragment instanceof FragmentTab2) {
this.fragmentTab2 = (FragmentTab2) fragment;
} else if(fragment instanceof SomeOtherFragment) {
this.someOtherFragment = (SomeOtherFragment) fragment;
} else ...
}