2
votes

I have a main activity with a navigation drawer and several fragments and a secondary activity that collects some data that I store on a string called "endpoints". I'm trying to send the string from the secondary activity to one of the fragments on the main activity:

Secondary Activity (sending "endpoint" string via intent to the Main activity):

        Intent intent = new Intent(Secondary.this,Main.class);
        intent.putExtra("endpoint",endpoint);
        startActivity(intent);

Main Activity (getting string from the Secondary activity):

    public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, PlaceholderFragment.newInstance(position))
            .commit();
    switch (position) {
        case 0:
            Bundle args = new Bundle();
            args.putString("endpoint",getIntent().getExtras().getString("endpoint"));
            Fragment1 fragment = new Fragment1();
            fragment1.setArguments(args);
            fragmentManager.beginTransaction().replace(R.id.container, Fragment1.newInstance(position)).commit();
            break;
        case 1:
            fragmentManager.beginTransaction().replace(R.id.container, Fragment2newInstance(position)).commit();
            break;
        case 2:
            fragmentManager.beginTransaction().replace(R.id.container, Fragment3.newInstance(position)).commit();
            break;
        case 3: ...

And on the Fragment class I'm trying to display the data on a TextView:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    String endpoints = getActivity().getIntent().getStringExtra("endpointStr");
    View rootView = inflater.inflate(R.layout.fragment_overview, container, false);
    TextView textView = (TextView) rootView.findViewById(R.id.overviewTV);
    textView.setText(endpoint);
    return rootView;
}

This is what I get:

E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.Main.app, PID: 16681 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Main.app/com.Main.app.Main}: android.view.InflateException: Binary XML file line #30: Error inflating class fragment Caused by: android.view.InflateException: Binary XML file line #30: Error inflating class fragment at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) at android.view.LayoutInflater.rInflate(LayoutInflater.java:758) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at android.view.LayoutInflater.inflate(LayoutInflater.java:353) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:343) at android.app.Activity.setContentView(Activity.java:1929) at com.Main.app.Main.onCreate(Main.java:42) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)             at android.app.ActivityThread.access$800(ActivityThread.java:144)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:136)             at android.app.ActivityThread.main(ActivityThread.java:5146)             at java.lang.reflect.Method.invokeNative(Native Method)             at java.lang.reflect.Method.invoke(Method.java:515)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)             at dalvik.system.NativeStart.main(Native Method)

        **Caused by: java.lang.NullPointerException**
        at com.Main.app.Main.onNavigationDrawerItemSelected(Main.java:65)
        at com.Main.app.NavigationDrawerFragment.selectItem(NavigationDrawerFragment.java:205)
        at com.Main.app.NavigationDrawerFragment.onCreate(NavigationDrawerFragment.java:79)
        at android.app.Fragment.performCreate(Fragment.java:1678)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:859)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1040)
        at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1142)
        at android.app.Activity.onCreateView(Activity.java:4786)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)

            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)             at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)             at android.view.LayoutInflater.inflate(LayoutInflater.java:492)             at android.view.LayoutInflater.inflate(LayoutInflater.java:397)             at android.view.LayoutInflater.inflate(LayoutInflater.java:353)             at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:343)             at android.app.Activity.setContentView(Activity.java:1929)             at com.Main.app.Main.onCreate(Main.java:42)             at android.app.Activity.performCreate(Activity.java:5231)             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)             at android.app.ActivityThread.access$800(ActivityThread.java:144)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:136)             at android.app.ActivityThread.main(ActivityThread.java:5146)             at java.lang.reflect.Method.invokeNative(Native Method)             at java.lang.reflect.Method.invoke(Method.java:515)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)             at dalvik.system.NativeStart.main(Native Method)

How can I get it fixed and send the string from one activity to a fragment on another activity?

Here's the XML:

<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
<FrameLayout
    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:fitsSystemWindows="true">
    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        tools:context=".Stackerz">

        <!-- As the main content view, the view below consumes the entire
             space available using match_parent in both dimensions. -->
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />

        <!-- android:layout_gravity="start" tells DrawerLayout to treat
             this as a sliding drawer on the left side for left-to-right
             languages and on the right side for right-to-left languages.
             If you're not building against API 17 or higher, use
             android:layout_gravity="left" instead. -->
        <!-- The drawer is given a fixed width in dp and extends the full height of
             the container. -->
        <fragment android:id="@+id/navigation_drawer"
            android:layout_width="@dimen/navigation_drawer_width"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:name="com.xxxxxx.app.NavigationDrawerFragment"
            tools:layout="@layout/fragment_navigation_drawer" />

    </android.support.v4.widget.DrawerLayout>
</FrameLayout>
3
Try this way : String endpoints = getArguments().getString()("endpointStr"); and threre is also problem in Fragment xml please post xml code.Haresh Chhelana
Tried that but it didn't work, got the same error. Added the XMLGITcommitEd
As long as working with simple types, you can simply use Intents, as you do, or SharedPreferences to store data that should be available in other Activities/Fragments. If you need to move complex objects between Activities or Fragments, I suggest looking at EventBus, see the edit of this answer: stackoverflow.com/questions/26152755/…cYrixmorten

3 Answers

2
votes

Ok, this is how your Constants class should look like.

public class Constants {

public static Constants constants=null;

public static Constants shared(){
    if (constants==null){
        constants = new Constants();
    }
    return constants;
}

public static String endpoint;

public static String getEndpoint() {
    return endpoint;
}

public static void setEndpoint(String endpoint) {
    Constants.endpoint = endpoint;
}

}

Now, in the second activity, do this:

    Constants.shared().setEndpoint(endpoint);
    Intent intent = new Intent(Secondary.this,Main.class);
    startActivity(intent);

And in your Fragment class, do this:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {
String endpoint = Constants.shared().getEndpoint;
View rootView = inflater.inflate(R.layout.fragment_overview, container, false);
TextView textView = (TextView) rootView.findViewById(R.id.overviewTV);
textView.setText(endpoint);
return rootView;
}
1
votes

If your Main activity is the central point that delegates data and work to fragments I would also store the information there. If you have a member variable in your Main activity to store your endpoint than each of the fragments can access it via:

((Main) getActivity()).setEndpoint(endpoint)

((Main) getActivity()).getEndpoint()

This way your Main activity is the controller.

0
votes

You don't even have to use intent.putExtra to complete this. You can simply introduce some static variables in your project.

Make a class called Constants.

in that class, make a variable

public static String endpoint;

Then, in your Secondary activity, instead of putExtra, simply do this:

Constants.endpoint = "your value";

Then, in your fragment simply do this:

TextView textView = (TextView) rootView.findViewById(R.id.overviewTV);
textView.setText(Constants.endpoint);