Search code examples
androiddialogfragment

How to start method from fragment b in fragment a, with specyfic show


I have a problem with starting method from fragment in another fragment.

I have 2 fragment. On with a drawer and in drawer i can choose the dialogFragment with informations. I ican open just a fragment but i want to create one fragment for all options.

So fragmentB is DialogFragment.

This is main method that i want call

 public void configureSettingsMenus(int position) {
    switch (position) {
        case TRADING_HISTORY:

            break;
        case LEADER_BOARD:

            break;
        case SPECIAL_OFFER:

            break;
        case VIDEO_TUTORIALS:

            break;
        case FAQ:

            break;
        case CONTACT:

            break;
        default:
            Toast.makeText(getContext(), "Something went wrong, try again...", Toast.LENGTH_SHORT).show();
            break;
    }

And this is that class

    public class SettingsFragment extends DialogFragment {


    private static final int TRADING_HISTORY = 1;
    private static final int LEADER_BOARD = 2;
    private static final int SPECIAL_OFFER = 3;
    private static final int VIDEO_TUTORIALS = 4;
    private static final int FAQ = 5;
    private static final int CONTACT = 6;


    String[] data = {"HERE", "WILL", "BE", "GAME", "HISTORY"};

    public SettingsFragment() {
    }

    public static SettingsFragment newInstance(int num) {
        SettingsFragment f = new SettingsFragment();
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_game_history, container, false);
        RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.history_games_recycler);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);
        RecyclerView.Adapter adapter = new WinLostHistoryAdapter(data);
        recyclerView.setAdapter(adapter);
        return view;
    }

    public void configureSettingsMenus(int position) {
        switch (position) {
            case TRADING_HISTORY:

                break;
            case LEADER_BOARD:

                break;
            case SPECIAL_OFFER:

                break;
            case VIDEO_TUTORIALS:

                break;
            case FAQ:

                break;
            case CONTACT:

                break;
            default:
                Toast.makeText(getContext(), "Something went wrong, try again...", Toast.LENGTH_SHORT).show();
                break;
        }


    }

}

And in FragmentA i create this:

DialogFragment settingsFragment = SettingsFragment.newInstance(1);

 private void configureDrawer(){
    result = new DrawerBuilder()
            .withSliderBackgroundColor(Color.GRAY)
            .withActivity(getActivity())
            .withDisplayBelowStatusBar(false)
            .withDrawerGravity(Gravity.LEFT)
            .withHeaderPadding(true)
            .addDrawerItems(
                    new SectionDrawerItem().withName("Options"),
                    new PrimaryDrawerItem().withName("Trading History").withIcon(R.drawable.trading_history).withIdentifier(1),
                    new PrimaryDrawerItem().withName("Leader Board").withIcon(R.drawable.leade_board).withIdentifier(2),
                    new PrimaryDrawerItem().withName("Special offer").withIcon(R.drawable.special_icon).withIdentifier(3),
                    new PrimaryDrawerItem().withName("Video tutorials").withIcon(R.drawable.video_tutorials).withIdentifier(4),
                    new PrimaryDrawerItem().withName("FAQ").withIcon(R.drawable.faq_icon).withIdentifier(5),
                    new PrimaryDrawerItem().withName("CONTACT").withIcon(R.drawable.contact_icon).withIdentifier(6)
            )
            .buildForFragment();

    result.setOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
        @Override
        public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
            FragmentTransaction ft = getChildFragmentManager().beginTransaction();
            ft.addToBackStack(null);
            if(position == 6)
            {
                result.closeDrawer();
                settingsFragment.show(ft, DIALOG_LOST);
            }

            return true;
        }
    });

and in setOnDrawerItemClickListener i want to call method from fragmentB

And my question is HOW?


Solution

  • Try this inside the onItemClick(...) callback:

    if (settingsFragment != null && settingsFragment instanceof SettingsFragment) {
        ((SettingsFragment) settingsFragment).configureSettingsMenus(position);
    }
    

    You have to Type Cast the class because in FragmentA you are holding a reference to a DialogFragment, which is an abstraction of the SettingsFragment class and does not contain the method configureSettingsMenus(...).

    You have to cast your DialogFragment instance to the concrete SettingsFragment in order to have access to the method configureSettingsMenus(...).

    -- Alternatively --

    Hold a reference to the concrete SettingsFragment class within FragmentA.

    replace:

    DialogFragment settingsFragment = SettingsFragment.newInstance(1);
    

    with:

    SettingsFragment settingsFragment = SettingsFragment.newInstance(1);
    

    Then inside the onItemClick(...) callback you can simply call the method directly without Type Casting:

    settingsFragment.configureSettingsMenus(position);