user3053246
user3053246

Reputation: 753

How to change fragments using Android navigation drawer

I know these types of question have already been here but still I have not found my answer for this question:

Here's what I have:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getFragmentManager().findFragmentById(R.id.navigation_drawer);
    mTitle = getTitle();

    // Set up the drawer.
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout) findViewById(R.id.drawer_layout));
}

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
            .commit();
}

public void onSectionAttached(int number) {
    switch (number) {
        case 1:

            break;
        case 2:

            break;
        case 3:

            break;
    }
}

And some more here:

    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached(
                getArguments().getInt(ARG_SECTION_NUMBER));
    }
}

I want to display another fragment using the button in navigation drawer. I want to use this code so please do not send me any guides or tutorials making their own drawers..

The question is, what do I put in case 1: case 2: and case 3: in case I want to open another fragment? Thanks.

One more question:

Upvotes: 41

Views: 79458

Answers (6)

Moayad Aburya
Moayad Aburya

Reputation: 1

In function:

   Bundle bundle = new Bundle();
   bundle.putInt("id", 10);//sending data to the second fragment                      
   NavHostFragment.findNavController(HomeFragment.this)//your fragment
   .navigate(R.id.action_nav_home_to_products_related_for_home_category,bundle);

In mobile_navigation.xml:

 <fragment
        android:id="@+id/nav_home"
        android:name="com.example.myapplication.ui.home.HomeFragment"
        android:label="@string/menu_home"
        tools:layout="@layout/fragment_home" >
        <action
            android:id="@+id/action_nav_home_to_products_related_for_home_category"
            app:destination="@id/products_related_for_home_category"
            app:enterAnim="@anim/nav_default_enter_anim"
            app:exitAnim="@anim/nav_default_exit_anim"
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim"
            >
            <argument
                android:name="myArg"
                app:argType="integer"
                android:defaultValue="1" />
        </action>
    </fragment>

In second fragment:

int id=getArguments().getInt("id");

Upvotes: 0

user5157325
user5157325

Reputation: 1

It does work in Eclipse IDE

   switch(getArguments().getInt(ARG_SECTION_NUMBER)) {
        case 1:
            rootView = inflater.inflate(R.layout.fragment_home, container, false);
            break;
        case 2:
            //rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
            break;
        case 3:
            //rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
            break;
        case 4:
            rootView = inflater.inflate(R.layout.fragment_info, container, false);
            break;
    }

in function

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = null;
    rootView = inflater.inflate(R.layout.fragment_home, container, false);
    return rootView;
}

Upvotes: 0

Nemesis
Nemesis

Reputation: 41

The response of DenisGl, is the right way !!! Using the class member, created by default, you can switch between the various components of the Navigation Drawer !! You have to use the method onCreateView, which are within the class member PlaceholderFragment. This class will be automatically invoked in the method onNavigationDrawerItemSelected

Here is the code example: /This method can be left as it is! It automatically invoke the class PlaceholderFragment!/

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
            .commit();
}

This method instead, where you enter the Switch Case:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = null;
        rootView = inflater.inflate(R.layout.fragment_home, container, false);
        switch(getArguments().getInt(ARG_SECTION_NUMBER)) {
            case 1:
                rootView = inflater.inflate(R.layout.fragment_home, container, false);
                break;
            case 2:
                //rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
                break;
            case 3:
                //rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
                break;
            case 4:
                rootView = inflater.inflate(R.layout.fragment_info, container, false);
                break;
        }
        return rootView;
    }

Obviously, you have to call the layout for each fragment that interests us!

This works 100%, Test to verify!

Upvotes: 2

DenisGl
DenisGl

Reputation: 87

I solved this problem over inflater:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView;
        switch(getArguments().getInt(ARG_SECTION_NUMBER)) {
            case 1:
                rootView = inflater.inflate(R.layout.fragment_obj_detail, container, false);
                break;
            case 2:
                rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
                break;
            case 3:
                rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
                break;
            case 4:
                rootView = inflater.inflate(R.layout.fragment_about, container, false);
                break;
            default:
                rootView = inflater.inflate(R.layout.fragment_obj_list, container, false);
        }
        return rootView;
    }

Upvotes: 7

Dreagen
Dreagen

Reputation: 1743

You should just put a switch statement into the onNavigationDrawerItemSelected method.

Something like this should work:

public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    Fragment fragment;
    FragmentManager fragmentManager = getFragmentManager(); // For AppCompat use getSupportFragmentManager
    switch(position) {
        default:
        case 0:
            fragment = new MyFragment1();
            break;
        case 1:
            fragment = new MyFragment2();
            break;
    }
    fragmentManager.beginTransaction()
        .replace(R.id.container, fragment)
        .commit();
}

This is just done quickly but I think it should work

Upvotes: 68

Egor
Egor

Reputation: 40193

You need to create a switch block inside the onNavigationDrawerItemSelected() and use the code that's already there for every case but with corresponding Fragment instead of PlaceholderFragment. Now it contains a generic piece of code for adding a PlaceholderFragment to the layout, reuse it for your purposes.

Upvotes: 5

Related Questions