未能传递结果ResultInfo{who=null,request=1,result=-1,data=Intent{dat=content://com.android.contacts/contacts/lookup...}}

未能传递结果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

我正在尝试从联系人列表中选择联系人并将其添加到数据库中。但是,每当我在onActivityResult中选择联系人和流程数据时,它都会引发以下异常:

 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 ...
}