【发布时间】:2014-06-20 20:31:31
【问题描述】:
我正在尝试从联系人列表中选择一个联系人并将其添加到数据库中。但是,每当我在 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 类中):
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
getActivity().startActivityForResult(intent, PICK_CONTACT);
onActivityResult 方法(在ChildTab2 类中):
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
switch (reqCode) {
case (PICK_CONTACT) :
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = getActivity().getContentResolver().query(contactData, null, null, null, null);
if (c.moveToFirst()) {
String contactId = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String phoneNumber = null;
String hasPhone = c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (hasPhone.equalsIgnoreCase("1"))
{
Cursor phones = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);
while (phones.moveToNext())
{
phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
phones.close();
ContentValues values = new ContentValues();
values.put(ProfilesProvider.NAME,name);
values.put(ProfilesProvider.NUMBER,phoneNumber);
getActivity().getContentResolver().insert(ProfilesProvider.PROFILES_CONTENT_URI, values);
}
else {
Toast.makeText(getActivity().getBaseContext(), "Phone Number Not Found", Toast.LENGTH_SHORT).show();
}
}
}
break;
}
}
在我的应用程序中,我实现了ActionBarShelock。因此,有三个选项卡(扩展 SherlockFragment),并且在第二个选项卡中包含另外两个选项卡(也扩展了 SherlockFragment)。所以,我将 onActivityResult 值从 MainActivity 传递到 FragmentTab2 到 ChildTab1 的 onActivityResult 方法,如下所示:
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
new FragmentTab2().onActivityResult(requestCode, resultCode, intent);
}
创建前三个选项卡的代码(在MainActivity 类中):
// Activate Navigation Mode Tabs
mActionBar = getSupportActionBar();
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Locate ViewPager in activity_main.xml
mPager = (ViewPager) findViewById(R.id.pager);
// Activate Fragment Manager
FragmentManager fm = getSupportFragmentManager();
// Capture ViewPager page swipes
ViewPager.SimpleOnPageChangeListener ViewPagerListener = new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
// Find the ViewPager Position
mActionBar.setSelectedNavigationItem(position);
}
};
mPager.setOnPageChangeListener(ViewPagerListener);
// Locate the adapter class called ViewPagerAdapter.java
ViewPagerAdapter viewpageradapter = new ViewPagerAdapter(fm);
// Set the View Pager Adapter into ViewPager
mPager.setAdapter(viewpageradapter);
// Create first Tab
tab = mActionBar.newTab().setText("Tab 1").setTabListener(tabListener);
mActionBar.addTab(tab);
// Create second Tab
tab = mActionBar.newTab().setText("Tab 2").setTabListener(tabListener);
mActionBar.addTab(tab);
// Create third Tab
tab = mActionBar.newTab().setText("Tab 3").setTabListener(tabListener);
mActionBar.addTab(tab);
以及创建子标签的代码(在FragmentTab2类中):
tabHost = new FragmentTabHost(getSherlockActivity());
tabHost.setup(getSherlockActivity(), getChildFragmentManager(), R.layout.fragmenttab2);
// Create Child Tab1
tabHost.addTab(tabHost.newTabSpec("childTab1").setIndicator("Child Tab 1"), ChildTab1.class, null);
// Create Child Tab2
tabHost.addTab(tabHost.newTabSpec("childTab2").setIndicator("Child Tab 2"), ChildTab2.class, null);
【问题讨论】:
-
你想在这里做什么:
new FragmentTab2().onActivityResult(requestCode, resultCode, intent);?另外请发布更多您的logcat。这一行没有多大帮助,我们需要看更多才能查明错误的根源。 -
onActivityResult方法没有在ChildTab1中被调用,但它正在调用MainActivity的onActivityResult 方法,所以我将MainActivity中的值传递给它的子FragmentTab2到是孩子ChildTab1。我在FragmentTab2的onActivityResult方法中调用new ChildTab1().onActivityResult(requestCode, resultCode, intent);。 -
但是您没有将任何值传递给
FragmentTab2,您只需创建一个FragmentTab2的新实例并在其上调用一个方法,然后这个新实例将立即被垃圾收集并再次销毁.如果要将值传递给现有实例,则必须在现有实例上调用此方法。仍然请发布更多相关代码和更多您的 logcat。没有它,我们只能猜测问题可能是什么。 -
糟糕,没有注意到我每次都在创建新实例。愚蠢的错误。 :) 而且,日志还有一件事,我忘了补充。现在,我已经添加了它。它在线抛出 NullPointerException :
Cursor c = getActivity().getContentResolver().query(contactData, null, null, null, null); -
这很可能是因为您每次都创建了一个新实例。如果您创建
Fragment的新实例,它不会立即附加到任何Activity,因此getActivity()将返回 null 并导致此NullPointerException。
标签: android actionbarsherlock android-tabhost onactivityresult android-nested-fragment