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