user4657208
user4657208

Reputation: 95

Passing data from one fragment to another is not working when passing data

I have a fragment fragmentA on which I have a gridview. The user clicks on a row the grid, I read the value of the first column and pass it to another fragment MapFragment. When I run in debug mode, I can see that the data from fragmentA is passed to the main activity and the app crashes.

What is wrong with code? Am I missing anything?

FATAL EXCEPTION: main java.lang.NullPointerException at com.text.MainActivity.SendData(MainActivity.java:51) at com.test.fragmentAFragment$1.onItemClick(BurnScheduleFragment.java:50) at android.widget.AdapterView.performItemClick(AdapterView.java:301) at android.widget.AbsListView.performItemClick(AbsListView.java:1539) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3332) at android.widget.AbsListView$1.run(AbsListView.java:4554) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:176) at android.app.ActivityThread.main(ActivityThread.java:5279) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) at dalvik.system.NativeStart.main(Native Method)

I have an interface as

 `public interface Communicate {
    public void SendData(String place);
}

In MapFragment

public class MapFragment extends Fragment {

    private MapView map;

    HashMap markerMap = new HashMap();
    Marker marker;

    public MapFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = this.getArguments();

    }

    public void Show(String title)
    {

        Marker showMarkerOnMap = (Marker)markerMap.get(title);
        showMarkerOnMap.showInfoWindow();
    }

    private void CreateMarkers(){

        GoogleMap gMap = map.getMap();
        gMap.setMyLocationEnabled(true);
        gMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

        marker = gMap.addMarker(new MarkerOptions().title("One")
                .snippet("description")
                .position(new LatLng( 0, 0)));
        markerMap.put("One", marker);

         }

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

        if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity().getApplicationContext()) == ConnectionResult.SUCCESS) {
            //Initialze mapview
            MapsInitializer.initialize(getActivity());
            map = (MapView) view.findViewById(R.id.mapView);
            map.onCreate(savedInstanceState);
            CreateMarkers();

        } else {
            Toast.makeText(getActivity(), "Please install google play services", Toast.LENGTH_LONG).show();
        }
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        map.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        map.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        map.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        map.onLowMemory();
    }
}

In My MainAcyivity I have

implemented the SendData as

public void SendData(String place)
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    MapFragment mapFragment = (MapFragment)fragmentManager.findFragmentById(R.id.mapView);
    mapFragment.Show(place);
}

and I have added the method Show in the MapFragment

  public void Show(String title)
{

    Marker showMarkerOnMap = (Marker)markerMap.get(title);
    showMarkerOnMap.showInfoWindow();
}



public class MainActivity extends ActionBarActivity
    implements NavigationDrawerFragment.NavigationDrawerCallbacks, Communicate {

private NavigationDrawerFragment mNavigationDrawerFragment;
private CharSequence mTitle;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
    mTitle = getTitle();

    // Set up the drawer.
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout) findViewById(R.id.drawer_layout));
}

public void SendData(String place)
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    MapFragment mapFragment = (MapFragment)fragmentManager.findFragmentById(R.id.mapView);
    mapFragment.Show(place);
}

@Override
public void onNavigationDrawerItemSelected(int position)
{
    // update the main content by replacing fragments

    Fragment fragment = null;
    switch (position){ 
        case 0:
            fragment= new MapFragment();
            break;
        case 1:
            fragment = new BFragment();
            break;
        case 2:                 
            break; 
        default:
            fragment =  new AFragment();
            break;
    }
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, fragment)
            .commit();
}

public void onSectionAttached(int number) {
    switch (number) {
        case 1:
            mTitle = getString(R.string.title_section1);
            break;
        case 2:
            mTitle = getString(R.string.title_section2);
            break;
        case 3:
            mTitle = getString(R.string.title_section3);
            break;
    }
}

public void restoreActionBar() {
    ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setDisplayShowTitleEnabled(true);
    actionBar.setTitle(mTitle);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (!mNavigationDrawerFragment.isDrawerOpen()) {
        // Only show items in the action bar relevant to this screen
        // if the drawer is not showing. Otherwise, let the drawer
        // decide what to show in the action bar.
        getMenuInflater().inflate(R.menu.main, menu);
        restoreActionBar();
        return true;
    }
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached(
                getArguments().getInt(ARG_SECTION_NUMBER));
    }
}

}

`

Map_fragment.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
</RelativeLayout>

Upvotes: 0

Views: 1031

Answers (2)

Yogendra
Yogendra

Reputation: 5260

To pass value from activity to fragment or fragment to fragment, use setArgument.

Bundle bundle = new Bundle(); bundle.putInt(key, value); fragment.setArguments(bundle);

How to pass values between Fragments

I hope it will help for you.

Upvotes: 0

Christian
Christian

Reputation: 4641

Your fragment is null. Otherwise the NullPointerException would be caused by the Fragment and not the Activity. Did you call getFragmentById with the correct ID which is the container ID or the XML-ID?

Upvotes: 1

Related Questions