0

Я пытаюсь реализовать навигационный ящик (based on this tutorial).NullPointerException with onItemЩелкните при открытии фрагмента

Когда элемент в ящике щелкнут, я хочу открыть фрагмент. Вот код из моего MainActivity.java

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       int editedPosition = position + 1; 
       Toast.makeText(MainActivity.this, "You selected item " + editedPosition, Toast.LENGTH_SHORT).show(); 


       switch(position){ 
        case 0: 
         Log.d("SWITCH", "Case 0"); 
         if (!(getSupportFragmentManager().getFragments().get(0) instanceof NewLogFragment)) { 
          getSupportFragmentManager().beginTransaction() 
            .replace(R.id.contentFrame, Fragment 
              .instantiate(MainActivity.this, Fragments.ONE.getFragment())) 
            .commit(); 
         } 
         break; 
        case 1: 
         if (!(getSupportFragmentManager().getFragments().get(0) instanceof LogFragment)) { 
          getSupportFragmentManager().beginTransaction() 
            .replace(R.id.contentFrame, Fragment 
              .instantiate(MainActivity.this, Fragments.ONE.getFragment())) 
            .commit(); 
         } 
         break; 
       } 
       mDrawerLayout.closeDrawer(mDrawerList); 
      } 
     }); 

Вот мой activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".MainActivity"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="@color/primary" 
     app:popupTheme="@style/Theme.AppCompat" 
     app:theme="@style/ToolbarTheme" /> 



    <!-- Main layout --> 
    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <FrameLayout 
      android:id="@+id/contentFrame" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"></FrameLayout> 


     <!-- Nav drawer --> 
     <ListView 
      android:id="@android:id/list" 
      android:layout_width="305dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      android:background="@android:color/white" /> 
    </android.support.v4.widget.DrawerLayout> 


</LinearLayout> 

Кроме того, вот мой Fragments.java

public enum Fragments { 

ONE(NewLogFragment.class),TWO(LogFragment.class); 

final Class<? extends Fragment> fragment; 

private Fragments(Class<? extends Fragment> fragment) { 
    this.fragment = fragment; 
} 

public String getFragment() { 
    return fragment.getName(); 
}} 

Когда я запускаю это, я получаю

java.lang.NullPointerException at sleeping_vityaz.fivethreeone_trainer.MainActivity$1.onItemClick(MainActivity.java:117) 

Строка 111 is th является линия

`if (!(getSupportFragmentManager().getFragments().get(0) instanceof LogFragment)) {` 

Подробнее:

  • MainActivity расширяет ActionBarActivity
  • Мои фрагменты простирается Fragment (android.support.v4.app.Fragment) везде

Так почему я получить это исключение нулевого указателя?

EDIT Я применил предложение Рохита и больше не получаю никаких ошибок. Однако макет не меняется. Что может быть неправильным?

EDIT @ я понял это ... не добавлял фрагментов в деятельности, в первую очередь ... так что не было ничего, чтобы заменить ДУХ :) Спасибо всем!

+0

Возможный дубликат [Что такое исключение Null Pointer Exception и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and- how-do-i-fix-it) – Simon

ответ

-1

Заменить

if (!(getSupportFragmentManager().getFragments().get(0) instanceof NewLogFragment)) 

с

if (!(getSupportFragmentManager().findFragmentById(R.id.contentFrame) instanceof NewLogFragment)) 

Аналогично изменить случай 1 слишком

РЕДАКТИРОВАТЬ

Заменить

Fragments.ONE.getFragment() 

с

Fragments.TWO.getFragment() 

в случае 0

+0

Это сработало, но макет не изменился вообще. Ошибок нет. Любая идея, что может быть неправильным? – naja

+0

Любые комментарии, почему downvoted? – Rohit5k2

+0

Я этого не делал. Ваше предложение помогло избавиться от ошибки. – naja

0

Ваша проблема getFragments() метод, который возвращает нулевой указатель. Если вы заглянете в документацию API Android, нет ни единого слова об этом методе.И если что-то не упоминается в официальных API, не следует ожидать, что он будет работать XD

EDIT: А во втором случае Вы хотите иметь:

instantiate(MainActivity.this, Fragments.TWO.getFragment())) 

вместо

instantiate(MainActivity.this, Fragments.ONE.getFragment())) 

EDIT 2 Ну, давайте попробуем с переключателем так:

switch(position){ 
         case 0: 
          Log.d("SWITCH", "Case 0"); 
           getSupportFragmentManager().beginTransaction() 
             .replace(R.id.contentFrame, Fragment 
               .instantiate(MainActivity.this, Fragments.ONE.getFragment())) 
             .commit(); 
          break; 
         case 1: 
           getSupportFragmentManager().beginTransaction() 
             .replace(R.id.contentFrame, Fragment 
               .instantiate(MainActivity.this, Fragments.TWO.getFragment())) 
             .commit(); 
          break; 
        } 
+0

спасибо. Предложение Рохита избавилось от исключения нулевого указателя, но теперь мой макет не изменяется onItemClick. Есть идеи? – naja

+0

:(удаление утверждений if не помогло ни – naja

Смежные вопросы