1

I get a NullPointerException when I try to load a fragment.

The stack trace is here:

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

All my XML is declared normally, and my starting activity's XML looks like this

<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 method for my activity looks like this:

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);
}

I don't see where I'm getting a NullPointerException (or why it's being thrown).

Edit: Some more code was requested, so I'm adding some more code:

The initializeChord method:

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;
}

The changeFragment method:

   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();
}

Some class members from the Atractr class:

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; 
docaholic
  • 613
  • 9
  • 29
  • 1
    not sure but your xml layout has issue android:layout_alignLeft="@+id/fragment1" android:layout_alignTop="@+id/fragment1" remove the + to android:layout_alignLeft="@id/fragment1" android:layout_alignTop="@id/fragment1" – Pulkit Sethi Aug 07 '13 at 00:57
  • Post some more code, I have in mind class members and their default values and initializeChord() method. – Gustek Aug 07 '13 at 01:04
  • Perhaps this is related: http://stackoverflow.com/questions/13393693/android-fragmentmanager-backstackrecord-run-throwing-nullpointerexception – CodeShane Aug 07 '13 at 02:16

1 Answers1

2

Functions show and hide works on existing fragments

Hides an existing fragment. This is only relevant for fragments whose views have been added to a container

Shows a previously hidden fragment. This is only relevant for fragments whose views have been added to a container

But fragments have separate life-cycle than activity and they may not be created and attached yet when activity's onCreate is called.

Check for null when You call Your changeFragment or inside of changeFragment.

If You want one of the fragments to be hidden on the beginning consider makeing a callback call from fragment in onAttached() method or add fragments manually instead of xml.

My preferred option is to do add fragments manually.

Community
  • 1
  • 1
Gustek
  • 3,680
  • 2
  • 22
  • 36