2013-08-07 3 views
1

Я получаю исключение NullPointerException при попытке загрузить фрагмент.NullPointerException при загрузке фрагментов

Трассировка стеки здесь:

08-07 00:43:11.780: E/AndroidRuntime(1366): FATAL EXCEPTION: main 
08-07 00:43:11.780: E/AndroidRuntime(1366): java.lang.RuntimeException: Unable to start activity ComponentInfo{ca.ioto.atractr_v2/ca.ioto.atractr_v2.Atractr}: java.lang.NullPointerException 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.os.Looper.loop(Looper.java:137) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at dalvik.system.NativeStart.main(Native Method) 
08-07 00:43:11.780: E/AndroidRuntime(1366): Caused by: java.lang.NullPointerException 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.app.BackStackRecord.run(BackStackRecord.java:661) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.app.Activity.performStart(Activity.java:5113) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153) 
08-07 00:43:11.780: E/AndroidRuntime(1366):  ... 11 more 

Всего мой XML объявляется нормально, и XML моей отправной данного вида деятельности выглядит следующим образом

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".Atractr" > 

<fragment 
    android:id="@+id/fragment1" 
    android:name="ca.ioto.atractr_v2.FindNearestDevicesFragment" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    tools:layout="@layout/findnearestdevices_fragment" /> 

<fragment 
    android:id="@+id/fragment2" 
    android:name="ca.ioto.atractr_v2.ChatFragment" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/fragment1" 
    android:layout_alignTop="@+id/fragment1" 
    tools:layout="@layout/chat_fragment" /> 

</RelativeLayout> 

The onCreate метод для моей деятельности выглядит следующим образом:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_atractr); 
    if (!chordStarted) { 
     initializeChord(); 
    } 
    newFragment = (FindNearestDevicesFragment)getFragmentManager().findFragmentById(R.id.fragment1); 
    chatFragment = (ChatFragment)getFragmentManager().findFragmentById(R.id.fragment2); 
    changeFragment(FINDNEARESTDEVICES); 
} 

Я не вижу, где я получаю исключение NullPointerException (или почему его бросают).

Edit: Еще немного кода было предложено, поэтому я добавляю еще немного кода:

initializeChord метод:

private void initializeChord(){ 
    chordMan = ChordManager.getInstance(this); 
    chordMan.setTempDirectory("/storage/emulated/0/Download"); 
    chordMan.setHandleEventLooper(getMainLooper()); 
    ArrayList<Integer> interfaces = (ArrayList<Integer>) chordMan.getAvailableInterfaceTypes(); 
    int result = chordMan.start(interfaces.get(0), chordManListener); 
    if (result == ChordManager.ERROR_FAILED) { 
     Utils.singleButtonAlert("Error","An error occured when starting Chord", this); 
     return; 
    } 
    chordStarted = true; 
} 

changeFragment метод:

private void changeFragment(int changeToFragment) 
{ 
    fragTransaction = getFragmentManager().beginTransaction(); 
    switch (changeToFragment){ 

    case FINDNEARESTDEVICES: 
     currentFragment = changeToFragment; 
     fragTransaction.show(newFragment); 
     fragTransaction.hide(chatFragment); 
     break; 
    case CHAT: 
     currentFragment = changeToFragment; 
     fragTransaction.show(chatFragment); 
     fragTransaction.hide(newFragment); 
     break; 
    } 
    fragTransaction.commit(); 
} 

Некоторые члены класса от класса Atractr:

private ChordManager chordMan; 
private IChordChannel commChannel; 
private FindNearestDevicesFragment newFragment; 
private ChatFragment chatFragment; 
private FragmentTransaction fragTransaction; 
private static boolean chordStarted = false; 
public final static int FINDNEARESTDEVICES = 1000; 
public final static int CHAT = 1001; 
private static int currentFragment = FINDNEARESTDEVICES; 
+1

не уверен, но макет XML имеет выпуск Android: layout_alignLeft = "@ + идентификатор/fragment1" андроид: layout_alignTop = "@ + идентификатор/fragment1" удалить + для Android: layout_alignLeft = "@ ID/fragment1" android: layout_alignTop = "@ id/fragment1" –

+0

Опубликуйте еще один код, я имею в виду члены класса и их значения по умолчанию и метод initializeChord(). – Gustek

+0

Возможно, это связано: http://stackoverflow.com/questions/13393693/android-fragmentmanager-backstackrecord-run-throwing-nullpointerexception – CodeShane

ответ

2

Функции отображения и скрытия работы существующих фрагментов

Скрывает существующий фрагмент. Это относится только к фрагментам, чьи представления добавлены в контейнер

Показывает ранее скрытый фрагмент. Это относится только к фрагментам, чьи представления добавлены в контейнер

Но фрагменты имеют отдельный жизненный цикл, чем активность, и они не могут быть созданы и присоединены еще при вызове функции onCreate.

Отметьте значение null, когда вы вызываете свой changeFragment или внутри changeFragment.

Если вы хотите, чтобы один из фрагментов был скрыт в начале, подумайте о том, чтобы сделать обратный вызов из фрагмента в методе onAttached() или добавить фрагменты вручную вместо xml.

Мой предпочтительный вариант - добавлять фрагменты вручную.

+0

Да, я пробовал это, и теперь он работает! большое спасибо! – docaholic

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