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?
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);