[英]Android Null Pointer Exception ListFragment
我不知道該怎么辦才能解決此空指針異常。 mButton.setText("Hi");
是什么觸發了它。 我嘗試查看其他問題,但無法使其正常工作。 這是我的代碼:
聯系人Tab.java
public class ContactsTab extends ListFragment implements LoaderCallbacks<Cursor> {
private CustomAdapter mAdapter;
private Cursor mCursor;
private String currentQuery;
private Button mButton;
private static final String[] PROJECTION = {
Contacts._ID,
Contacts.DISPLAY_NAME_PRIMARY,
Contacts.LOOKUP_KEY,
Contacts.PHOTO_THUMBNAIL_URI,
Contacts.HAS_PHONE_NUMBER,
};
private static final String[] FROM = { Contacts.DISPLAY_NAME_PRIMARY };
private static final int[] TO = { R.id.contact_text };
private static final String SELECTION = "(" + Contacts.IN_VISIBLE_GROUP + " = 1) AND (" + Contacts.HAS_PHONE_NUMBER + " != 0 )";
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
View v =inflater.inflate(R.layout.contacts_tab, container, false);
mButton = (Button) v.findViewById(R.id.badge);
mButton.setText("Hi");
return v;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCursor = null;
mAdapter = new CustomAdapter(getActivity(), R.layout.contacts_list_item, mCursor, FROM, TO, 0);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
getListView().setDivider(null);
getListView().setDividerHeight(0);
}
...
}
contacts_tab.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/contacts_list"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
contacts_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal"
android:background="@color/white">
<Button
android:id="@+id/badge"
android:background="@drawable/circle_button"
android:fontFamily="sans-serif-thin"
android:textSize="24sp"
android:textColor="@color/white"
android:layout_width="42dp"
android:layout_height="42dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:gravity="center"/>
<TextView
android:id="@+id/contact_text"
android:layout_width="match_parent"
android:layout_height="64dp"
android:textColor="@color/grey_dark"
android:textSize="20sp"
android:fontFamily="sans-serif-thin"
android:gravity="center_vertical"/>
</LinearLayout>
通過代碼
View v =inflater.inflate(R.layout.contacts_tab, container, false);
mButton = (Button) v.findViewById(R.id.badge);
mButton.setText("Hi");
您正在嘗試獲取Button
,它是contacts_tab.xml
一部分,但是在此xml中您沒有任何按鈕。
您的適配器列表項中有按鈕,您需要使用適配器獲取對該按鈕的引用。
您需要在適配器中而不是在片段中執行此操作。 在適配器中,您將對listview的每個項目都有一個引用。
除了@Anand Singh答案之外,使用ListFragment
需要具有預定義ListView id的特定布局:
ListFragment具有由單個列表視圖組成的默認布局。 但是,如果需要,可以通過從onCreateView(LayoutInflater,ViewGroup,Bundle)返回自己的視圖層次結構來自定義片段布局。
為此,您的視圖層次結構必須包含ID為“ @android:id / list”(或列表,如果在代碼中,則為List)的ListView對象
有關更多信息,請參閱ListFragment文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.