Android通过接口java nullpointerexception传递值

Android通过接口java nullpointerexception传递值,java,android,interface,android-library,Java,Android,Interface,Android Library,我有一个寻呼机适配器,如下所示 public class MainPagerFragmentAdapter extends FragmentPagerAdapter implements IdInterface { ContactsFragment contactSearch; public MainPagerFragmentAdapter(FragmentManager fragmentManager) { super(fragmentManager); } @Override

我有一个寻呼机适配器,如下所示

public class MainPagerFragmentAdapter extends FragmentPagerAdapter implements IdInterface {

ContactsFragment contactSearch;

public MainPagerFragmentAdapter(FragmentManager fragmentManager) {
    super(fragmentManager);
}

@Override
public Fragment getItem(int position) {

    switch (position) {
    case 0:
        if (contactSearch == null)
            contactSearch = new ContactsFragment();
        return contactSearch;
    }

    return null;
}

public void onRawIdAcquired(long arg0) {
    Log.d("LOG","id=" + arg0);
}
}

这是我的联系人片段

public class ContactsFragment extends Fragment implements
    LoaderManager.LoaderCallbacks<Cursor> {
private long rawId;
private SimpleCursorAdapter mAdapter;

public static final String ARG_ID = "RAWID";
public static final String SORT_KEY_PRIMARY = "sort_key";
public static final Uri URI = ContactsContract.Data.CONTENT_URI;

public static final String[] PROJECTION = new String[] {
        ContactsContract.Data._ID, ContactsContract.Data.RAW_CONTACT_ID};

public static final String SELECTION = ContactsContract.Data.MIMETYPE
        + " = ? ";

public static final List<String> ARGS;
static {
    ARGS = new ArrayList<String>();
    ARGS.add(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE);
}

private ListView mContactList;
private View mContactFragmentView;
private TextView noResultText;
private Button searchOnlineBtn;

IdInterface dataPasser;

public ContactsFragment() {
    dataPasser = (IdInterface) null;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    super.onCreateView(inflater, container, savedInstanceState);
    mContactFragmentView = inflater.inflate(R.layout.fragment_contacts,
            container, false);

    mContactList = (ListView) mContactFragmentView
            .findViewById(R.id.contacts_list);

    String[] fromColumns = { SORT_KEY_PRIMARY };
    int[] toViews = { R.id.contactName };
    mAdapter = new ContactsCursorAdapter(getActivity(),
            R.layout.contact_list_item, null, fromColumns, toViews);
    mContactList.setAdapter(mAdapter);

    mContactList.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Cursor cursor = (Cursor) parent.getAdapter().getItem(position);

            rawId = cursor.getLong(cursor
                    .getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID));

            Bundle params = new Bundle();
            params.putLong(ARG_ID, rawId);
            ContactsFragment fragobj = new ContactsFragment();
            fragobj.setArguments(params);
            Log.v("", "fragobj=" + params);

            try {
                dataPasser.onRawIdAcquired(rawId);
            } catch (Exception e) {
                Log.v("", "error=" + e);
            }

        }

    });
    getLoaderManager().initLoader(0, null, this);
    return mContactFragmentView;
}
}

当我单击该项时,它捕获java.lang.nullpointerexception 我应该怎么做才能让MainPagerFragmentAdapter在单击任何联系人Id时获得Id


注意:ContactsFragment是一个库项目,因此我使用接口在项目之间传递值

您的
dataPasser
null


将其初始化为实现接口的非空对象,或检查
!=在尝试对其调用方法之前为null。

在构造函数中,将
dataPasser
设置为null:

IdInterface dataPasser;

public ContactsFragment() {
    dataPasser = (IdInterface) null; // <- Here
}

在Return getItem函数中,除非请求位置0,否则始终返回null 然后返回一个Contacts片段

这个函数是在单击项目时调用的,所以我想这就是您会发现问题的地方

public Fragment getItem(int position) {

switch (position) {
case 0:
    if (contactSearch == null)
        contactSearch = new ContactsFragment();
    return contactSearch;
}

return null;  <--- should be the problem


或者创建一个实现这个接口的新类,并在这里实例化它。

最终解决了这个问题,在片段中初始化dataPasser,如下所示

@Override
public void onAttach(Activity activity){
  super.onAttach(activity);
  context = getActivity();
  dataPasser =(IdInterface)context;
}

接口应该在调用FragmentAdapter而不是FragmentAdapter的MainActivity上实现。

是的,添加stacktrace,这样就可以很容易地解决您的问题。我知道,我是编程新手。请您指出我应该在何处以及如何初始化数据通道的解决方案。我是编程新手。请您指出我应该在何处以及如何初始化DataPassenger的解决方案,比如我将return null替换为return contactSearch,仍然是generate java.lang.NullPointerException您以前初始化过吗?尝试“返回新的ContactsFragment”;是的,我确实初始化了ContactsFragment,但仍然是相同的异常,可能是因为我没有初始化dataPasser。如果是,我现在该怎么办?已尝试但不起作用,因为Fragment page是一个Android库项目,我发现很难将此值发回非Android库项目。您尝试了什么?我给了你两个选择。他们至少应该修复nullpointerexception。顺便问一下:你是在你的捕获部分还是在其他地方得到了例外?
public Fragment getItem(int position) {

switch (position) {
case 0:
    if (contactSearch == null)
        contactSearch = new ContactsFragment();
    return contactSearch;
}

return null;  <--- should be the problem
dataPasser = (IdInterface) null;
dataPasser = new IdInterface {
    public void onRawIdAcquired(long rawId){
        //your code
    }
};
@Override
public void onAttach(Activity activity){
  super.onAttach(activity);
  context = getActivity();
  dataPasser =(IdInterface)context;
}