-3

I am learning android. I have got one source code from codecanyon. I am facing one error in it like below.

android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment

My Activity in which I am getting error is like below

public class HomeActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener{

    private ViewPager viewPager;
    private BottomNavigationView bottomNavigationView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        ButterKnife.bind(this);

        Activity mActivity = this;
        viewPager = findViewById(R.id.viewpager);
        bottomNavigationView = findViewById(R.id.bottomNavigationView);
        bottomNavigationView.setOnNavigationItemSelectedListener(this);

        setupViewPager(viewPager);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if(position == 0){
                    bottomNavigationView.setSelectedItemId(R.id.menuHome);
                }else if(position == 1){
                    bottomNavigationView.setSelectedItemId(R.id.menuAccount);
                }else{
                    bottomNavigationView.setSelectedItemId(R.id.menuSetup);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        SharedPreferences pref = mActivity.getSharedPreferences("setting", MODE_PRIVATE);
        int membership = pref.getInt("membership", 1);
        if(membership == 0) {
            if (!HomeActivity.this.isFinishing()) {
                AlertManager.createCallbackAlert(mActivity, "Warning", "Trial expired if premium not purchased your account history will be deleted in 3 days", false, "OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                }, "BUY", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        viewPager.setCurrentItem(1);
                    }
                });
            }
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new StateFragment(), "HOME");
        adapter.addFragment(new AccountFragment(), "ACCOUNT");
        adapter.addFragment(new SetupFragment(), "SETUP");
        viewPager.setAdapter(adapter);
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.menuHome:
                viewPager.setCurrentItem(0);

                break;
            case R.id.menuAccount:
                viewPager.setCurrentItem(1);

                break;
            case R.id.menuSetup:

                viewPager.setCurrentItem(2);
                break;
        }


        return true;
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}

and my Fragment is like below

@SuppressLint("ValidFragment")
public class Weekly extends Fragment {

    AccountType accountType;

    @SuppressLint("ValidFragment")
    public Weekly(AccountType accountType) {
        this.accountType = accountType;

    }

    TextView tvSubType;
    TextView tvSubDesc;
    private ItemClickListner itemClickListner;

    public interface ItemClickListner {
        void onItemClick(int postion);
    }

    public void setItemClickListner(ItemClickListner itemClickListner) {
        this.itemClickListner = itemClickListner;
    }


    Button btnPurchase;


    private static final String TAG = "Weekly";
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View inflate = inflater.inflate(R.layout.weekly_subscption, null, false);
        tvSubType = inflate.findViewById(R.id.tvSubType);
        btnPurchase = inflate.findViewById(R.id.btnPurchase);
        tvSubType.setText(accountType.getType());

        tvSubDesc = inflate.findViewById(R.id.tvSubDesc);
        tvSubDesc.setText(accountType.getDesc());


        btnPurchase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                accountType.itemClickListner.onItemClick(accountType.getIndex());

            }
        });


        return inflate;
    }
}

My AccountType class is like below

public class AccountType {

    String type;
    String desc;

    int index;
    MembershipFragment.ItemClickListner itemClickListner;

    public AccountType(String type, String desc, int index, MembershipFragment.ItemClickListner itemClickListner) {
        this.type = type;
        this.desc = desc;
        this.index = index;
        this.itemClickListner = itemClickListner;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public MembershipFragment.ItemClickListner getItemClickListner() {
        return itemClickListner;
    }

    public void setItemClickListner(MembershipFragment.ItemClickListner itemClickListner) {
        this.itemClickListner = itemClickListner;
    }
}

Let me know if someone can help me for come out from this error. If its simple, please forgive me because I am trying to fix it from last one and half hour but I am not able to do it. Thanks a lot.

Hina Patel
  • 59
  • 6

1 Answers1

0

A Fragment must have a no-argument constructor. Those warnings you suppressed with @SuppressLint("ValidFragment") are real.

If you need to pass data to a fragment, use an arguments bundle instead. You can bundle AccountType by changing it to extend serializable:

public class AccountType implements Serializable {

Then remove the current constructor in Weekly and instead pass it to the Fragment with a static method that puts it in a bundle

public static Weekly newInstance(AccountType t) {
    Weekly fragment = new Weekly();
    Bundle args = new Bundle();
    args.putSerializable("ACCOUNT", t);
    fragment.setArguments(args);
    return fragment;
}

Weekly() {}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Bundle args = getArguments();
    accountType = (AccountType)args.getSerializable("ACCOUNT");
}

Then instead of creating the fragment with

new Weekly(account);

you would use

Weekly.newInstance(account);
Tyler V
  • 9,694
  • 3
  • 26
  • 52