简体   繁体   中英

Navigation drawer Fragment Issue

Hi i have this problem with my navigation drawer. The drawer opens fine but i am having problems with the onClickListener. if an item on the drawer is clicked on it doesnt show the related layout instaed a black page shows. Please help

home.java

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.Toast;

public class home extends AppCompatActivity {

    //Defining Variables
    private Toolbar toolbar;
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;

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

        // Initializing Toolbar and setting it as the actionbar
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //Initializing NavigationView
        navigationView = (NavigationView) findViewById(R.id.navigation_view);

        //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            // This method will trigger on item Click of navigation menu
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {


                //Checking if the item is in checked state or not, if not make it in checked state
                if(menuItem.isChecked()) menuItem.setChecked(false);
                else menuItem.setChecked(true);

                //Closing drawer on item click
                drawerLayout.closeDrawers();

                //Check to see which item was being clicked and perform appropriate action
                switch (menuItem.getItemId()){


                    //Replacing the main content with ContentFragment Which is our Inbox View;
                    case R.id.dashboard:
                        Toast.makeText(getApplicationContext(),"dashboard",Toast.LENGTH_SHORT).show();
                        Dashboard fragment = new Dashboard();
                        android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.frame,fragment);
                        fragmentTransaction.commit();
                       break;

                    // For rest of the options we just show a toast on click

                    case R.id.profile:
                        Toast.makeText(getApplicationContext(),"profile",Toast.LENGTH_SHORT).show();
                        new Profile();
                        break;
                    case R.id.logs:
                        Toast.makeText(getApplicationContext(),"logs",Toast.LENGTH_SHORT).show();
                        new Logs();
                        break;
                    case R.id.statements:
                        Toast.makeText(getApplicationContext(),"statements",Toast.LENGTH_SHORT).show();
                        new Statements();
                       break;
                    case R.id.timeline:
                        Toast.makeText(getApplicationContext(),"timeliine",Toast.LENGTH_SHORT).show();
                        new Timeline();
                        break;
                    case R.id.settings:
                        Toast.makeText(getApplicationContext(),"settings",Toast.LENGTH_SHORT).show();
                        new Settings();
                        break;

                    default:
                        Toast.makeText(getApplicationContext(),"Somethings Wrong",Toast.LENGTH_SHORT).show();
                        break;

                }
          return true;  }
        });

        // Initializing Drawer Layout and ActionBarToggle
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.openDrawer, R.string.closeDrawer){

            @Override
            public void onDrawerClosed(View drawerView) {
                // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
                super.onDrawerClosed(drawerView);
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank

                super.onDrawerOpened(drawerView);
            }
        };

        //Setting the actionbarToggle to drawer layout
        drawerLayout.setDrawerListener(actionBarDrawerToggle);

        //calling sync state is necessay or else your hamburger icon wont show up
        actionBarDrawerToggle.syncState();






    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

You're not switching fragments correctly in your case statements. You're only instantiating a new Fragment class and not doing anything with it. You need to do something like this:

Fragment fragment;
switch (menuItem.getItemId()){


                //Replacing the main content with ContentFragment Which is our Inbox View;
                case R.id.dashboard:
                    Toast.makeText(getApplicationContext(),"dashboard",Toast.LENGTH_SHORT).show();
                    fragment = new Dashboard();
                   break;

                // For rest of the options we just show a toast on click

                case R.id.profile:
                    Toast.makeText(getApplicationContext(),"profile",Toast.LENGTH_SHORT).show();
                    fragment = new Profile();
                    break;
                case R.id.logs:
                    Toast.makeText(getApplicationContext(),"logs",Toast.LENGTH_SHORT).show();
                    fragment = new Logs();
                    break;
                case R.id.statements:
                    Toast.makeText(getApplicationContext(),"statements",Toast.LENGTH_SHORT).show();
                    fragment = new Statements();
                   break;
                case R.id.timeline:
                    Toast.makeText(getApplicationContext(),"timeliine",Toast.LENGTH_SHORT).show();
                    fragment = new Timeline();
                    break;
                case R.id.settings:
                    Toast.makeText(getApplicationContext(),"settings",Toast.LENGTH_SHORT).show();
                    fragment = new Settings();
                    break;

                default:
                    Toast.makeText(getApplicationContext(),"Somethings Wrong",Toast.LENGTH_SHORT).show();
                    break;

            }
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.frame,fragment);
                    fragmentTransaction.commit();

This way you're instantiating a fragment with a proper Fragment class each time, and at the end, replacing the frame with that particular fragment.

Digresion: It is recommended that you use newInstance to get the fragments and not the constructor. This is known as the Singleton design pattern.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM