2

I have two fragments within one fragment using ViewPager.

Sometimes my app crash with following error:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.MyAcitivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.fragments.MyFragment: make sure class name exists, is public, and has an empty constructor that is public
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2318)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396)
       at android.app.ActivityThread.access$800(ActivityThread.java:139)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:149)
       at android.app.ActivityThread.main(ActivityThread.java:5257)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:633)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.fragments.MyFragment: make sure class name exists, is public, and has an empty constructor that is public
       at android.support.v4.app.Fragment.instantiate(Fragment.java:413)
       at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
       at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1801)
       at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:213)
       at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:97)
       at com.buzzreel.MyActivity.onCreate(MyActivity.java:55)
       at android.app.Activity.performCreate(Activity.java:5411)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396)
       at android.app.ActivityThread.access$800(ActivityThread.java:139)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:149)
       at android.app.ActivityThread.main(ActivityThread.java:5257)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:633)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: java.lang.InstantiationException: can't instantiate class com.fragments.MyFragment; no empty constructor
       at java.lang.Class.newInstanceImpl(Class.java)
       at java.lang.Class.newInstance(Class.java:1208)
       at android.support.v4.app.Fragment.instantiate(Fragment.java:402)
       at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
       at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1801)
       at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:213)
       at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:97)
       at com.buzzreel.MyActivity.onCreate(MyActivity.java:55)
       at android.app.Activity.performCreate(Activity.java:5411)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2396)
       at android.app.ActivityThread.access$800(ActivityThread.java:139)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:149)
       at android.app.ActivityThread.main(ActivityThread.java:5257)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:633)
       at dalvik.system.NativeStart.main(NativeStart.java)

But i have two constructors in my fragment class as follows:

public MyFragment(CustomObject custom) {
        this.custom = custom;
    }


    public MyFragment() {

    }

My pager adapter call:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.fragments.MyFragment

public class MyPagerAdapter extends FragmentPagerAdapter {
    private String tabtitles[] = new String[] { "Info" };
    private CustomOjbect object;

    public MyPagerAdapter(FragmentManager fm, CustomOjbect object) {
        super(fm);
        this.object = object;
    }

    @Override
    public Fragment getItem(int index) {
        switch (index) {
        case 0:
            return new MyFragment(object);

        }

        return null;
    }

    @Override
    public int getCount() {
        return 1;

    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tabtitles[position];
    }

}

Fragment Code [Code was big as other was relevant just keeping core code]

public class MyFragment extends Fragment implements  OnClickListener {

    /**
    Variable declaration for widgets and views comes here
    **/

    public MyFragment(CustomObject object) {
        this.object = object;
    }

    public  MyFragment()
    {

    }

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

        initializeUIComponents();
        /**
        ...
        ..
        rest of code 

        **/
        return view;
    }



    private void initializeUIComponents() {
        // ui views initialization
    }


}

In View pager i call constructor with arguements. Why is it failing?

virendrao
  • 1,763
  • 2
  • 22
  • 42
  • paste the line of code where you are calling constructor – Kushal Apr 29 '15 at 04:20
  • Show us the full source of the Fragment. – Jared Burrows Apr 29 '15 at 04:29
  • You may get more interesting information from here [link](http://stackoverflow.com/questions/10450348/do-fragments-really-need-an-empty-constructor) – NamNH Apr 29 '15 at 05:20
  • @Ugo i have only portrait orientation for all activities – virendrao Apr 29 '15 at 05:53
  • It isn't really about the orientation. It's about the overloaded constructor and the non-static inner Fragment class. It is possible that you have your Fragment as an inner class to another class. In that case, it should be static. The answers in that question might tell you more. – ugo Apr 29 '15 at 05:58

2 Answers2

0

Looks like your packages differ.

import com.fragment.MyFragment

vs

can't instantiate class com.fragments.MyFragment
Simas
  • 43,548
  • 10
  • 88
  • 116
0

Avoid having overloading constructors other than default non-argument constructor for fragment, as only the default non-argument constructor will be called when Android framework decides it needs to recreate your fragment again. You can use setArguments() and getArguments() to pass 'constructor arguments' to your fragment instead.

See: http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html

hidro
  • 12,333
  • 6
  • 53
  • 53
  • so i have to create getInstance static method which takes input as my CustomOjbect set it in bundle and use that value from bundle on my onCreateView of fragment to use values from it ? – virendrao Apr 29 '15 at 06:31