簡體   English   中英

Android空指針異常ListFragment

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM