0

I created an android application with dynamic tabs. Users can create tabs on the go.

What I need to achieve is that When a fragment is created each newly created fragment should be assigned a unique ID/text.

Also when I switch between Fragment and when a fragment is visible I need to get that fragment id/text from that currently visible fragment.

I created Tabs using viewpager and TabLayout. I found some suggestion to add a tag when creating using Fragment Transaction but that doesn't work in this scenario.

My ViewPager class:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    private final ArrayList<Fragment> mFragmentList = new ArrayList<>();
    private final ArrayList<String> mFragmentTitleList = new ArrayList<>();
    Context context;
    ViewPager viewPager;
    TabLayout tabLayout;
    int selectedTabPosition;
    PreferenceHelper prefs;
    private Map<Integer, String> mFragmentTags;
    private FragmentManager mFragmentManager;
    private boolean doNotifyDataSetChangedOnce = false;
    public ViewPagerAdapter(FragmentManager manager, Context context, ViewPager viewPager,
                            TabLayout tabLayout) {
        super(manager);
        this.context = context;
        this.viewPager = viewPager;
        this.tabLayout = tabLayout;
        mFragmentTags = new HashMap<Integer, String>();
        prefs = new PreferenceHelper(context);
    }

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

    @Override
    public int getCount() {
        if (doNotifyDataSetChangedOnce) {
            doNotifyDataSetChangedOnce = false;
            notifyDataSetChanged();
        }
        return mFragmentList.size();
    }

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

    public void removeFrag(int position) {
        removeTab(position);
        Fragment fragment = mFragmentList.get(position);
        mFragmentList.remove(fragment);
        mFragmentTitleList.remove(position);
        //destroyFragmentView(viewPager, position, fragment);
        notifyDataSetChanged();
        Log.e("getCount()", String.valueOf(getCount()));
        if (getCount() > 0)
            tabLayout.setupWithViewPager(viewPager);
        setupTabLayout();
    }

    public View getTabView(final int position) {
        View view = LayoutInflater.from(context).inflate(R.layout.custom_tab_item, null);
        TextView tabItemName = (TextView) view.findViewById(R.id.textViewTabItemName);
        ImageView tabItemAvatar =
            (ImageView) view.findViewById(R.id.imageViewTabItemAvatar);
        ImageButton remove = (ImageButton) view.findViewById(R.id.imageButtonRemove);
        if(getCount() == 1){
            remove.setVisibility(View.INVISIBLE);
        }
        else{
            remove.setVisibility(View.VISIBLE);
        }
        remove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    Log.d("Remove", "Remove");
                    if(getCount() != 1){
                        removeFrag(position);
                    }
                    else{
                       // Toast.makeText("Atleast One Tab is requied")
                    }

            }
        });
        tabItemName.setText(mFragmentTitleList.get(position));
        tabItemName.setTextColor(context.getResources().getColor(android.R.color.background_light));
        tabItemAvatar.setImageResource(R.drawable.boy);
        return view;
    }
    public void setupTabLayout() {
        selectedTabPosition = viewPager.getCurrentItem();
       // Toast.makeText(context, "selectedTabPosition --> "+selectedTabPosition, Toast.LENGTH_SHORT).show();
        for (int i = 0; i < tabLayout.getTabCount(); i++) {
            tabLayout.getTabAt(i).setCustomView(getTabView(i));
        }
    }

    public void removeTab(int position) {
        if (tabLayout.getChildCount() > 0 && tabLayout!=null) {
            tabLayout.removeTabAt(position);
            prefs.remove("POS"+position);

        }

    }
    /*@Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        if (mCurrentFragment != object) {
            mCurrentFragment = (Fragment) object;
        }
        super.setPrimaryItem(container, position, object);
    }*/

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Object object = super.instantiateItem(container, position);
        if (object instanceof Fragment) {
            Fragment fragment = (Fragment) object;
            String tag = fragment.getTag();
            mFragmentTags.put(position, tag);
        }
        return object;
    }

    public Fragment getFragment(int position) {
        Fragment fragment = null;
        String tag = mFragmentTags.get(position);
        if (tag != null) {
            fragment = mFragmentManager.findFragmentByTag(tag);
        }
        return fragment;
    }

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

Please suggest me a solution. I am very new to this Fragments and Tabs

Ali
  • 3,346
  • 4
  • 21
  • 56
  • Take a look at [this answer](https://stackoverflow.com/a/29269509/6287910) to a similar question. I think that you will find what you need there. – Cheticamp Feb 27 '18 at 13:51
  • @Cheticamp That still tells about if we knows which fragment right? –  Feb 27 '18 at 13:54
  • It will help you to assign unique id's to your fragments. – Cheticamp Feb 27 '18 at 13:56
  • @Cheticamp. How could i get that tag from my childfragments then? –  Feb 27 '18 at 14:01
  • You would set up a separate list that relates adapter position to the fragment tag or, as an alternative, you could set a variable within the fragment class itself that provides the information you need. If you set up a list, you will need to maintain it as tabs are added/deleted. – Cheticamp Feb 27 '18 at 14:13
  • @Cheticamp Can you please provide a sample code –  Feb 27 '18 at 14:17

0 Answers0