Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

Không chuyển fragment khi chọn từ menu navigation

Discussion in 'Hướng dẫn lập trình Android' started by hanhnguyentran2311vn, 31/3/17.

  1. Mình có làm cái app kết hợp giữa MaterialTabHost và NavigationView mà khi click vào navigation nó không chuyển tới fragment mới. Ae xem hỗ trợ mình với, code phần navigation có tham khảo ở trên mạng

    [​IMG]
    MainActivity.java

    Code:
    MainActivity.java
    
    public class MainActivity extends ActionBarActivity implements MaterialTabListener {
        private String TAG = MainActivity.class.getSimpleName();
        MaterialTabHost tabHost;
        ViewPager pager;
    
        ViewPagerAdapter adapter;
        private String[] tabs =  {"Home","Category","Favourite"};
        Toolbar toolbar;
        String strMessage;
        private AdView mAdView;
        private InterstitialAd mInterstitial;
        private String name, link;
        private ProgressDialog pDialog;
    
        private NavigationView navigationView;
        private DrawerLayout drawer;
        private View navHeader;
        private ImageView imgNavHeaderBg, imgProfile;
        private TextView txtName, txtWebsite;
        private FloatingActionButton fab;
    
    
    
        // index to identify current nav menu item
        public static int navItemIndex = 0;
    
        // tags used to attach the fragments
        private static final String TAG_HOME = "home";
        public static String CURRENT_TAG = TAG_HOME;
    
        // toolbar titles respected to selected nav menu item
        private String[] activityTitles;
    
        // flag to load home fragment when user presses back key
        private boolean shouldLoadHomeFragOnBackPress = true;
        private Handler mHandler;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
                setContentView(R.layout.activity_main);
                toolbar = (Toolbar) this.findViewById(R.id.toolbar);
                toolbar.setTitle(getString(R.string.app_name));
                this.setSupportActionBar(toolbar);
    
                tabHost = (MaterialTabHost) this.findViewById(R.id.tabHost);
                pager = (ViewPager) this.findViewById(R.id.pager );
                adapter = new ViewPagerAdapter(getSupportFragmentManager());
                pager.setAdapter(adapter);
    
                pager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        // when user do a swipe the selected tab change
                        tabHost.setSelectedNavigationItem(position);
    
                    }
                });
    
                for(String tab_name:tabs)
                {
                    tabHost.addTab(
                            tabHost.newTab()
                                    .setText(tab_name)
                                    .setTabListener(MainActivity.this)
                    );
                }
                //navigation
    
            mHandler = new Handler();
    
            drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            navigationView = (NavigationView) findViewById(R.id.nav_view);
    
    
            // Navigation view header
            navHeader = navigationView.getHeaderView(0);
            txtName = (TextView) navHeader.findViewById(R.id.name);
            txtWebsite = (TextView) navHeader.findViewById(R.id.website);
            imgNavHeaderBg = (ImageView) navHeader.findViewById(R.id.img_header_bg);
            imgProfile = (ImageView) navHeader.findViewById(R.id.img_profile);
    
            // load toolbar titles from string resources
            activityTitles = getResources().getStringArray(R.array.nav_item_activity_titles);
    
    
    
            // load nav menu header data
            loadNavHeader();
    
            // initializing navigation menu
            setUpNavigationView();
    
            if (savedInstanceState == null) {
                navItemIndex = 0;
                CURRENT_TAG = TAG_HOME;
                loadHomeFragment();
            }
    
                //end navigation
    
    
    
        }
    
    //navigation
    
        private void loadNavHeader() {
            // name, website
            txtName.setText("Ravi Tamada");
            txtWebsite.setText("www.androidhive.info");
    
            // loading header background image
            Glide.with(this).load(urlNavHeaderBg)
                    .crossFade()
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(imgNavHeaderBg);
    
            // Loading profile image
            Glide.with(this).load(urlProfileImg)
                    .crossFade()
                    .thumbnail(0.5f)
                    .bitmapTransform(new CircleTransform(this))
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(imgProfile);
    
            // showing dot next to notifications label
            navigationView.getMenu().getItem(3).setActionView(R.layout.menu_dot);
        }
    
    
        private void setUpNavigationView() {
            //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) {
    
                    //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.home:
                            navItemIndex = 0;
                            CURRENT_TAG = TAG_HOME;
                            break;
                        case R.id.nav_photos:
                            navItemIndex = 1;
                            CURRENT_TAG = TAG_PHOTOS;
                            break;
                        case R.id.nav_movies:
                            navItemIndex = 2;
                            CURRENT_TAG = TAG_MOVIES;
                            break;
                        case R.id.nav_notifications:
                            navItemIndex = 3;
                            CURRENT_TAG = TAG_NOTIFICATIONS;
                            break;
                        case R.id.nav_settings:
                            navItemIndex = 4;
                            CURRENT_TAG = TAG_SETTINGS;
                            break;
                        case R.id.nav_about_us:
                            // launch new intent instead of loading fragment
                            startActivity(new Intent(MainActivity.this, HomeFragment.class));
                            drawer.closeDrawers();
                            return true;
                        case R.id.nav_privacy_policy:
                            // launch new intent instead of loading fragment
                            startActivity(new Intent(MainActivity.this, HomeFragment.class));
                            drawer.closeDrawers();
                            return true;
                        default:
                            navItemIndex = 0;
                    }
    
                    //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);
                    }
                    menuItem.setChecked(true);
    
                    loadHomeFragment();
    
                    return true;
                }
            });
    
    
            ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawer, 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
            drawer.setDrawerListener(actionBarDrawerToggle);
    
            //calling sync state is necessary or else your hamburger icon wont show up
            actionBarDrawerToggle.syncState();
        }
    
        private void selectNavMenu() {
            navigationView.getMenu().getItem(navItemIndex).setChecked(true);
        }
        private void loadHomeFragment() {
            // selecting appropriate nav menu item
            selectNavMenu();
    
            if (getSupportFragmentManager().findFragmentByTag(CURRENT_TAG) != null) {
                drawer.closeDrawers();
    
                // show or hide the fab button
    
                return;
            }
    
            // Sometimes, when fragment has huge data, screen seems hanging
            // when switching between navigation menus
            // So using runnable, the fragment is loaded with cross fade effect
            // This effect can be seen in GMail app
            Runnable mPendingRunnable = new Runnable() {
                @Override
                public void run() {
                    // update the main content by replacing fragments
                    Fragment fragment = getHomeFragment();
                    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.setCustomAnimations(android.R.anim.fade_in,
                            android.R.anim.fade_out);
                    fragmentTransaction.replace(R.id.frame, fragment, CURRENT_TAG);
                    fragmentTransaction.commitAllowingStateLoss();
                }
            };
    
            // If mPendingRunnable is not null, then add to the message queue
            if (mPendingRunnable != null) {
                mHandler.post(mPendingRunnable);
            }
    
            // show or hide the fab button
    
    
            //Closing drawer on item click
            drawer.closeDrawers();
    
            // refresh toolbar menu
            invalidateOptionsMenu();
        }
    
        private Fragment getHomeFragment() {
            switch (navItemIndex) {
                case 0:
                    // home
                    HomeFragment homeFragment = new HomeFragment();
                    return homeFragment;
                case 1:
                    // photos
                    PhotosFragment photosFragment = new PhotosFragment();
                    return photosFragment;
                case 2:
                    // movies fragment
                    CategoryFragment moviesFragment = new CategoryFragment();
                    return moviesFragment;
                case 3:
                    // notifications fragment
                    CategoryFragment notificationsFragment = new CategoryFragment();
                    return notificationsFragment;
    
                case 4:
                    // settings fragment
                    CategoryFragment settingsFragment = new CategoryFragment();
                    return settingsFragment;
                default:
                    return new HomeFragment();
            }
        }
    @Override
    public void onBackPressed() {
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawers();
            return;
        }
    
        // This code loads home fragment when back key is pressed
        // when user is in other fragment than home
        if (shouldLoadHomeFragOnBackPress) {
            // checking if user is on other navigation menu
            // rather than home
            if (navItemIndex != 0) {
                navItemIndex = 0;
                CURRENT_TAG = TAG_HOME;
                loadHomeFragment();
                return;
            }
        }
    
        super.onBackPressed();
    }
    
    
    
        //end navigation
        @Override
        public void onTabSelected(MaterialTab tab) {
            // TODO Auto-generated method stub
            pager.setCurrentItem(tab.getPosition());
        }
    
        @Override
        public void onTabReselected(MaterialTab tab) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onTabUnselected(MaterialTab tab) {
            // TODO Auto-generated method stub
    
        }
    
    
    
    
        private class ViewPagerAdapter extends FragmentStatePagerAdapter {
    
            public ViewPagerAdapter(FragmentManager fm) {
                super(fm);
    
            }
    
            public Fragment getItem(int num) {
    
                switch (num) {
                    case 0:
                        return new HomeFragmentCheck();
                    case 1:
                        return new CategoryFragmentCheck();
                    case 2:
                        return new FavouriteFragment();
                }
                return null;
            }
    
            @Override
            public int getCount() {
                return 3;
            }
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
    
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.home, menu);
    
    
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem menuItem)
        {     
            switch (menuItem.getItemId())
            {
            case R.id.about:
                Intent intab=new Intent(MainActivity.this,AboutActivity.class);
                startActivity(intab);
                break;
    
                case R.id.update:
    
                    showPU();
    
                    break;
    
    
            default:
                return super.onOptionsItemSelected(menuItem);
            }
            return true;
    
    
    
        }
    
    
    }
    activity_main.xml

    Code:
     <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">
    
    
    
    
    
        <RelativeLayout
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:ads="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity" >
    
    <include
            layout="@layout/app_bar_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="@color/m_tab_clr"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
    
            <it.neokree.materialtabs.MaterialTabHost
                android:id="@+id/tabHost"
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:layout_below="@+id/toolbar"
                app:accentColor="@color/m_tab_select_accent_clr"
                app:primaryColor="@color/m_tab_clr" />
    
            <android.support.v4.view.ViewPager
                android:id="@+id/pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_above="@+id/ad_linear"
                android:layout_below="@+id/tabHost" />
    
            <LinearLayout
                android:id="@+id/ad_linear"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:orientation="horizontal" >
    
    
            </LinearLayout>
        </RelativeLayout>
    
    
    
    </android.support.v4.widget.DrawerLayout>
    app_bar_main.xml

    Code:
     <?xml version="1.0" encoding="utf-8"?>
        <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            tools:context="com.app.apk.MainActivity">
    
            <android.support.design.widget.AppBarLayout
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:theme="@style/AppTheme.AppBarOverlay">
            </android.support.design.widget.AppBarLayout>
            <FrameLayout
                android:id="@+id/frame"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"></FrameLayout>
    <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_main"
            app:menu="@menu/activity_main_drawer" />
    
        </android.support.design.widget.CoordinatorLayout>
     
    Last edited: 31/3/17

Chia sẻ trang này

Loading...