Click here to Skip to main content
15,891,431 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
Hi!

I am trying to do following:

MainActivitiy(starts)-->TabFragment[FragmentPagerAdapter](starts) -->StyleFragment[has 4 Image Buttons to start 4 different Fragments]-->(regarding which is clicked) a proper Fragment should be shown in the next tab.


MainActivity
|
|
TabFragment
|
|
|_ _Tab(Style)
| |_ _ _ Style_Fragment(4 Buttons; Classic, Triple, Quadrupel,Multiple)
|
|
|
|_ _ _ Tab(Bild(Picture))
| |_ _ _ Classic
| |
| |_ _ _ Triple
| |
| |_ _ _ Quadrupel
| |
| |_ _ _ Multiple
|
|_ _ _ Tab C
| |_ _ _ Fragment 7
| |
| |_ _ _ Fragment 8
| |
| |_ _ _ Fragment 8
| |

I am able to pass Arguments from "Style_Fragment" to the "MainActivty" and Update the Tab Position, but I am not able to set the proper Fragment into that tab. I tried different approaches but I could never pass an Argument from Activity to TabFragment (paramter: "style_n") If i hardcoded the paramter "public static style_n = 1"(for style_classic) it shows the proper Fragment in the proper tab-Position. I can change style_n=2(for style_triple) and so on and that works. I tried it with bundles, Parameters for the TabFragment, Bundle, global Arguments for the whole application, a Special data storing class...nothing works. I think it has somehow to do with the Fragment LifeCycle.

Please see following Code:

MainActivity:

Java
import java.nio.BufferUnderflowException;

public class MainActivity extends AppCompatActivity implements fragments_communicate {
    DrawerLayout mDrawerLayout;
    NavigationView mNavigationView;
    FragmentManager mFragmentManager;
    FragmentTransaction mFragmentTransaction;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        /**
         *Setup the DrawerLayout and NavigationView
         */

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
        mNavigationView = (NavigationView) findViewById(R.id.shitstuff) ;

        /**
         * Lets inflate the very first fragment
         * Here , we are inflating the TabFragment as the first Fragment
         */

        mFragmentManager = getSupportFragmentManager();
        mFragmentTransaction = mFragmentManager.beginTransaction();
        mFragmentTransaction.replace(R.id.containerView, new TabFragment()).addToBackStack(null).commit();


        /**
         * Setup click events on the Navigation View Items.
         */

        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                mDrawerLayout.closeDrawers();


                switch (menuItem.getItemId()) {
                    case R.id.nav_item_sent:
                        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                        fragmentTransaction.replace(R.id.containerView, new OneFragment()).addToBackStack(null).commit();
                        break;
                    case R.id.nav_item_inbox:
                        FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction();
                        xfragmentTransaction.replace(R.id.containerView, new OneFragment()).addToBackStack(null).commit();
                        break;

                    default:
                        break;
                }


                return false;
            }

        });

        /**
         * Setup Drawer Toggle of the Toolbar
         */

        android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
        toolbar.setLogo(R.mipmap.ic_launcher);
        ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, toolbar,R.string.app_name,
                R.string.app_name);

        mDrawerLayout.setDrawerListener(mDrawerToggle);

        mDrawerToggle.syncState();

    }


    public void updateTab(int tab_number, int style_number)
    {
        TabFragment tfrag = new TabFragment();
        tfrag.update_viewPager(tab_number);
        //to be implemented for style_number (I removed that for your ideas)
    }



}



TabFragment:

Java
public class TabFragment extends Fragment  {

    public static TabLayout tabLayout;
    public static ViewPager viewPager;
    public static int int_items = 4 ;
    public static int style_n =1; 
//if I hardcode that I get the correct results
//but I want to Change that value with help of the Main Activity but nothing works

    public TabFragment()
    {

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        /**
         *Inflate tab_layout and setup Views.
         */
        View x =  inflater.inflate(R.layout.tab_layout,null);
        tabLayout = (TabLayout) x.findViewById(R.id.tabs);
        viewPager = (ViewPager) x.findViewById(R.id.viewpager);
        /**

         *Set an Apater for the View Pager
         */
        viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
        /**
         * Now , this is a workaround ,
         * The setupWithViewPager dose't works without the runnable .
         * Maybe a Support Library Bug .
         */
        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
            }
        });

        return x;

    }


    public class MyAdapter extends FragmentPagerAdapter{


        public MyAdapter(FragmentManager fm) {
            super(fm);
        }
        /**
         * Return fragment with respect to Position .
         */

        @Override
        public Fragment getItem(int position)
        {

            switch (position){

                case 0 : return new StyleFragment();

                case 1 :

                    if (style_n == 1) {

                        return new StyleClassicFragment();
                    }
                    else if (style_n == 2)
                    {
                        return new StyleTripleFragment();
                    }
                    else if (style_n == 3)
                    {
                        return new StyleQuadrupelFragment();

                    }
                    else if (style_n == 4)
                    {
                        return new StyleMultipleFragment();

                    }

                case 2: return new OneFragment();

                case 3: return new PictureFragment();


            }
            return null;
        }

        @Override
        public int getCount() {

            return int_items;

        }

        /**
         * This method returns the title of the tab according to the position.
         */

        @Override
        public CharSequence getPageTitle(int position) {

            switch (position){
                case 0 :
                    return "Style";
                case 1 :
                    return "Bild";
                case 2  :
                    return "One";
                case 3  :
                    return "Picture";

            }
            return null;
        }

    }

    public void update_viewPager(int tab_number)
    {
        viewPager.setCurrentItem(tab_number);
    }

}



Style_Fragment:

Java
package com.sub_zero.ipostcard.fragments.tabs.Style;

/**
 * Created by Sub-Zero on 10.01.2016.
 */

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;

import com.sub_zero.ipostcard.R;
import com.sub_zero.ipostcard.interf.fragments_communicate;

public class StyleFragment extends Fragment implements View.OnClickListener {

    View rootView;
    fragments_communicate fc;


    ImageButton imageButton_classic, imageButton_triple, imageButton_quadrupel, imageButton_multiple ;

    public StyleFragment() {
        // Required empty public constructor
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_style, container, false);
        imageButton_classic = (ImageButton) rootView.findViewById(R.id.imageButton_style_classic);
        imageButton_classic.setOnClickListener(this);
        imageButton_triple = (ImageButton) rootView.findViewById(R.id.imageButton_style_triple);
        imageButton_triple.setOnClickListener(this);
        imageButton_quadrupel = (ImageButton) rootView.findViewById(R.id.imageButton_style_quadrupel);
        imageButton_quadrupel.setOnClickListener(this);
        imageButton_multiple = (ImageButton) rootView.findViewById(R.id.imageButton_style_multiple);
        imageButton_multiple.setOnClickListener(this);
        fc = (fragments_communicate) getActivity();
        // Inflate the layout for this fragment
        return rootView;
    }

    @Override
    public void onClick(View v) {
        //do what you want to do when button is clicked
        switch (v.getId()) {
            case R.id.imageButton_style_classic:
                //1st Argument:return fragment at TabPosition 1(Bild)
                //2nd argument: regarding which style return: 1=Classic, 2=triple, 3=quadrupel, 4=multiple Fragment
                fc.updateTab(1, 1);
                break;
            case R.id.imageButton_style_triple:
                //return triple_fragment at TabPosition 1(Bild)
                fc.updateTab(1, 2);
                break;
            case R.id.imageButton_style_quadrupel:
                //return quadrupel fragment at TabPosition 1(Bild)
                fc.updateTab(1, 3);
                break;
            case R.id.imageButton_style_multiple:
                //return multiple fragment at TabPosition 1(Bild)
                fc.updateTab(1, 4);
        }
    }


    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
    }

    @Override
    public void onDetach()
    {
        super.onDetach();
    }



}



Interface (Fragment_communicate):

C#
public interface fragments_communicate{
    public void updateTab(int tab_number, int style_number);
}
Posted
Updated 18-Jan-16 7:30am
v4

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900