2016-05-09 3 views
0

У меня есть макет фрагмента, который векселедатель и выглядит следующим образом:NullPointerException при установке ListView адаптера (DrawerLayout)

fragment_overview.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<!-- The main content view --> 
<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ffe887" /> 

<!-- The navigation drawer --> 
<ListView android:id="@+id/left_drawer" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:choiceMode="multipleChoice" 
    android:divider="@android:color/transparent" 
    android:dividerHeight="0dp" 
    android:background="#111"/> 
</android.support.v4.widget.DrawerLayout> 

И класс Java для этого фрагмента:

OverviewFragment.java

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.fragment_overview, container, false); 

    mlistOptions = getResources().getStringArray(R.array.list_options); 
    mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) getActivity().findViewById(R.id.left_drawer); 

    // Set the adapter for the list view 
    mDrawerList.setAdapter(new ArrayAdapter<String>(getActivity(), 
      R.layout.simple_list_item_1, mlistOptions)); 

    mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

    return root; 
} 

С помощью этого кода в папке ресурсов:

<string-array name="list_options"> 
    <item>Ship</item> 
    <item>Map</item> 
    <item>Mail</item> 
    <item>Settings</item> 
    <item>Logout</item> 
</string-array> 

И это как элемент списка:

simple_list_item_1.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:padding="15dp" 
android:textColor="@android:color/black" 
android:textStyle="italic"> 

Однако, когда в setAdapter метод запускается в классе java, он генерирует эту ошибку:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference 

Что может быть неправильно вызвано этим вызовом метода? Это фрагмент, поэтому нам нужен getActivity в качестве первого параметра, файл макета - это просто ссылка на простой файл, а список параметров - это просто аррайалист из папки ресурсов .. что может быть нулевым?

Заранее благодарен!

+0

, если '' left_drawer ListView внутри '' fragment_overview макет затем использовать 'root' вместо' getActivity() ', чтобы получить доступ к нему –

+0

Спасибо это сработало! – boking

ответ

0

попробуйте это, вместо использования getActivity используйте root, чтобы раздуть макет, потому что ваш компонент теперь находится в корневом представлении.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.fragment_overview, null); 

    mlistOptions = getResources().getStringArray(R.array.list_options); 
    mDrawerLayout = (DrawerLayout) root.findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) root.findViewById(R.id.left_drawer); 

    // Set the adapter for the list view 
    mDrawerList.setAdapter(new ArrayAdapter<String>(getActivity(), 
      R.layout.simple_list_item_1, mlistOptions)); 

    mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

    return root; 
} 
+2

Хотя это может ответить на вопрос OP, размещение твердых блоков кода без каких-либо объяснений не служит образовательной цели. Пожалуйста, улучшите свой ответ, объяснив, почему этот код является решением, или если он основан на том, что изменилось и по какой причине. –

+0

Спасибо, что сработали! – boking

+0

@ boking принять и ответить на голосование, если он работает для вас. Другие могут получить помощь в этом ответе –

0

Вы должны заполнить свой список ящиков в своем основном действии. Поместите этот код в метод onCreate вашей деятельности.

Затем в onCreateView вашего фрагмента вы надуваете еще один макет, который будет помещен в ваш (основной вид активности) FrameLayout.

0

Попробуйте заменить ваш

mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout); 
mDrawerList = (ListView) getActivity().findViewById(R.id.left_drawer); 

с

mDrawerLayout = (DrawerLayout) root.findViewById(R.id.drawer_layout); 
mDrawerList = (ListView) root.findViewById(R.id.left_drawer); 
Смежные вопросы