0

I have a fragment in a TabLayout which contains a list.
I would like to populate that list each time a push notification is received (from MainActivity.OnCreate)

TabFragment2.java:

public class TabFragment2 extends Fragment {

    ListView lv;
    List<String> your_array_list;
    ArrayAdapter<String> arrayAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tab_fragment_2, container, false);
        lv = (ListView)view.findViewById(R.id.listView);
        return view;
    }

    public void addToList(String str) {

        your_array_list = new ArrayList<String>();
        your_array_list.add(str);

        arrayAdapter = new ArrayAdapter<String>(
                getActivity(),
                android.R.layout.simple_list_item_1,
                your_array_list );
        lv.setAdapter(arrayAdapter);



    }

}

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
...
...
...
        Bundle extras = getIntent().getExtras();
        // If we returned from a notification
        if(extras !=null) {
            String value = extras.getString("keynme");
            TabFragment2 tab2 = new TabFragment2();
            tab2.addToList("faaa");
        }

    }
}

The problem is that TabFragment2 crashes on getActivity() when it is called by MainActivity. does the main activity have to pass the fragment the activity? will it still be added in the fragment?

EDIT crashlog:

07-01 13:41:50.315 20922-20922/com.push.myapplication E/AndroidRuntime: 

FATAL EXCEPTION: main
Process: com.push.myapplication, PID: 20922
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.push.myapplication/com.push.myapplication.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)
  at android.app.ActivityThread.access$800(ActivityThread.java:156)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:211)
  at android.app.ActivityThread.main(ActivityThread.java:5373)
  at java.lang.reflect.Method.invoke(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
  at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
  at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153)
  at com.push.myapplication.TabFragment2.addToList(TabFragment2.java:44)
  at com.push.myapplication.MainActivity.onCreate(MainActivity.java:59)
  at android.app.Activity.performCreate(Activity.java:5990)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 
  at android.app.ActivityThread.access$800(ActivityThread.java:156) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
  at android.os.Handler.dispatchMessage(Handler.java:102) 
  at android.os.Looper.loop(Looper.java:211) 
  at android.app.ActivityThread.main(ActivityThread.java:5373) 
  at java.lang.reflect.Method.invoke(Native Method) 
  at java.lang.reflect.Method.invoke(Method.java:372) 
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
hardillb
  • 54,545
  • 11
  • 67
  • 105
toothpick
  • 113
  • 18

4 Answers4

0

I think you should use interface to achieve this

Akshay Panchal
  • 695
  • 5
  • 15
0

better create your fragment instance as TabFragment2 tab2 = TabFragment2.newInstance(); instead of TabFragment2 tab2 = new TabFragment2();

Mr.7
  • 2,292
  • 1
  • 20
  • 33
  • i think you might have created as `TabFragment2 tab2 = new TabFragment2.newInstance();` instead of `TabFragment2 tab2 = TabFragment2.newInstance();` – Mr.7 Jul 01 '16 at 10:49
  • go through this link. it may help you: http://stackoverflow.com/questions/9245408/best-practice-for-instantiating-a-new-android-fragment – Mr.7 Jul 01 '16 at 11:06
0

getActivity() can return null if it is called before onAttach of the respective fragment.

Possible way: make array your_array_list as class variable and call Adapter initialization in onActivityCreated method

Oleksandr
  • 1,492
  • 3
  • 9
  • 13
  • but what if `OnAttach` is called before `onCreateView`? my ListView is not defined by then and `lv.setAdapter(arrayAdapter)` may cause a crash – toothpick Jul 01 '16 at 11:37
  • Agree with you. Look at fragment lifecycle https://developer.android.com/guide/components/fragments.html#Lifecycle Use onActivityCreated instead of onAttach – Oleksandr Jul 01 '16 at 12:40
0

you cannot do this

if(extras !=null) {
            String value = extras.getString("keynme");
            TabFragment2 tab2 = new TabFragment2();
            tab2.addToList("faaa");// if your fragment is not attached to activity subsequent call will crash app.
        }


arrayAdapter = new ArrayAdapter<String>(
                getActivity()// if your fragment is not attached to any activity this will return null,
                android.R.layout.simple_list_item_1,
                your_array_list );