如何在导航抽屉中创建子菜单

问题描述:

public class NavigationDrawerFragment extends Fragment { 

    /** 
    * Remember the position of the selected item. 
    */ 
    private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position"; 

    /** 
    * Per the design guidelines, you should show the drawer on launch until the 
    * user manually expands it. This shared preference tracks this. 
    */ 
    private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned"; 

    /** 
    * A pointer to the current callbacks instance (the Activity). 
    */ 
    private NavigationDrawerCallbacks mCallbacks; 

    /** 
    * Helper component that ties the action bar to the navigation drawer. 
    */ 
    private ActionBarDrawerToggle mDrawerToggle; 

    private DrawerLayout mDrawerLayout; 
    private ExpandableListView mDrawerListView; 
    private View mFragmentContainerView; 

    List<String> groupList; 
    List<String> childList; 
    Map<String, List<String>> laptopCollection; 

    private int mCurrentSelectedPosition = 0; 
    private boolean mFromSavedInstanceState; 
    private boolean mUserLearnedDrawer; 

    public NavigationDrawerFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Read in the flag indicating whether or not the user has demonstrated 
     // awareness of the 
     // drawer. See PREF_USER_LEARNED_DRAWER for details. 
     SharedPreferences sp = PreferenceManager 
       .getDefaultSharedPreferences(getActivity()); 
     mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false); 

     if (savedInstanceState != null) { 
      mCurrentSelectedPosition = savedInstanceState 
        .getInt(STATE_SELECTED_POSITION); 
      mFromSavedInstanceState = true; 
     } 

     // Select either the default item (0) or the last selected item. 
     selectItem(mCurrentSelectedPosition); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     // Indicate that this fragment would like to influence the set of 
     // actions in the action bar. 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 


     createGroupList(); 

      createCollection(); 

      mDrawerListView = (ExpandableListView) inflater.inflate(
        R.layout.fragment_navigation_drawer, container, false); 
      final ExpandableListAdapter expListAdapter = new ExpandableListAdapter(
        getActivity(), groupList, laptopCollection); 
      mDrawerListView.setAdapter(expListAdapter); 

      //setGroupIndicatorToRight(); 

      mDrawerListView.setOnChildClickListener(new OnChildClickListener() { 

       public boolean onChildClick(ExpandableListView parent, View v, 
         int groupPosition, int childPosition, long id) { 
        final String selected = (String) expListAdapter.getChild(
          groupPosition, childPosition); 
        Toast.makeText(getActivity().getBaseContext(), selected, Toast.LENGTH_LONG) 
          .show(); 

        return true; 
       } 
      }); 
      return mFragmentContainerView; 


     } 

     private void createGroupList() { 
      groupList = new ArrayList<String>(); 
      groupList.add("HP"); 
      groupList.add("Dell"); 
      groupList.add("Lenovo"); 
      groupList.add("Sony"); 
      groupList.add("HCL"); 
      groupList.add("Samsung"); 
     } 

     private void createCollection() { 
      // preparing laptops collection(child) 
      String[] hpModels = { "HP Pavilion G6-2014TX", "ProBook HP 4540", 
        "HP Envy 4-1025TX" }; 
      String[] hclModels = { "HCL S2101", "HCL L2102", "HCL V2002" }; 
      String[] lenovoModels = { "IdeaPad Z Series", "Essential G Series", 
        "ThinkPad X Series", "Ideapad Z Series" }; 
      String[] sonyModels = { "VAIO E Series", "VAIO Z Series", 
        "VAIO S Series", "VAIO YB Series" }; 
      String[] dellModels = { "Inspiron", "Vostro", "XPS" }; 
      String[] samsungModels = { "NP Series", "Series 5", "SF Series" }; 

      laptopCollection = new LinkedHashMap<String, List<String>>(); 

      for (String laptop : groupList) { 
       if (laptop.equals("HP")) { 
        loadChild(hpModels); 
       } else if (laptop.equals("Dell")) 
        loadChild(dellModels); 
       else if (laptop.equals("Sony")) 
        loadChild(sonyModels); 
       else if (laptop.equals("HCL")) 
        loadChild(hclModels); 
       else if (laptop.equals("Samsung")) 
        loadChild(samsungModels); 
       else 
        loadChild(lenovoModels); 

       laptopCollection.put(laptop, childList); 
      } 
     } 

     private void loadChild(String[] laptopModels) { 
      childList = new ArrayList<String>(); 
      for (String model : laptopModels) 
       childList.add(model); 
     } 

     @SuppressWarnings("unused") 
     private void setGroupIndicatorToRight() { 
      /* Get the screen width */ 
      DisplayMetrics dm = new DisplayMetrics(); 
      getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); 
      int width = dm.widthPixels; 

      mDrawerListView.setIndicatorBounds(width - getDipsFromPixel(35), width 
        - getDipsFromPixel(5)); 
     } 

     // Convert pixel to dip 
     public int getDipsFromPixel(float pixels) { 
      // Get the screen's density scale 
      final float scale = getResources().getDisplayMetrics().density; 
      // Convert the dps to pixels, based on density scale 
      return (int) (pixels * scale + 0.5f); 
     } 









     /*mDrawerListView = (ExpandableListView) inflater.inflate(
       R.layout.fragment_navigation_drawer, container, false); 
     mDrawerListView 
       .setOnItemClickListener(new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> parent, View view, 
          int position, long id) { 
         selectItem(position); 
        } 
       }); 
     mDrawerListView.setAdapter(new ArrayAdapter<String>(getActionBar() 
       .getThemedContext(), 
       android.R.layout.simple_list_item_activated_1, 
       android.R.id.text1, new String[] { 
         getString(R.string.title_section1), 
         getString(R.string.title_section2), 
         getString(R.string.title_section3), })); 
     mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);*/ 



    public boolean isDrawerOpen() { 
     return mDrawerLayout != null 
       && mDrawerLayout.isDrawerOpen(mFragmentContainerView); 
    } 

    /** 
    * Users of this fragment must call this method to set up the navigation 
    * drawer interactions. 
    * 
    * @param fragmentId 
    *   The android:id of this fragment in its activity's layout. 
    * @param drawerLayout 
    *   The DrawerLayout containing this fragment's UI. 
    */ 
    public void setUp(int fragmentId, DrawerLayout drawerLayout) { 
     mFragmentContainerView = getActivity().findViewById(fragmentId); 
     mDrawerLayout = drawerLayout; 

     // set a custom shadow that overlays the main content when the drawer 
     // opens 
     mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, 
       GravityCompat.START); 
     // set up the drawer's list view with items and click listener 

     ActionBar actionBar = getActionBar(); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setHomeButtonEnabled(true); 

     // ActionBarDrawerToggle ties together the the proper interactions 
     // between the navigation drawer and the action bar app icon. 
     mDrawerToggle = new ActionBarDrawerToggle(getActivity(), /* host Activity */ 
     mDrawerLayout, /* DrawerLayout object */ 
     R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ 
     R.string.navigation_drawer_open, /* 
             * "open drawer" description for 
             * accessibility 
             */ 
     R.string.navigation_drawer_close /* 
             * "close drawer" description for 
             * accessibility 
             */ 
     ) { 
      @Override 
      public void onDrawerClosed(View drawerView) { 
       super.onDrawerClosed(drawerView); 
       if (!isAdded()) { 
        return; 
       } 

       getActivity().invalidateOptionsMenu(); // calls 
                 // onPrepareOptionsMenu() 
      } 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       if (!isAdded()) { 
        return; 
       } 

       if (!mUserLearnedDrawer) { 
        // The user manually opened the drawer; store this flag to 
        // prevent auto-showing 
        // the navigation drawer automatically in the future. 
        mUserLearnedDrawer = true; 
        SharedPreferences sp = PreferenceManager 
          .getDefaultSharedPreferences(getActivity()); 
        sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true) 
          .apply(); 
       } 

       getActivity().invalidateOptionsMenu(); // calls 
                 // onPrepareOptionsMenu() 
      } 
     }; 

     // If the user hasn't 'learned' about the drawer, open it to introduce 
     // them to the drawer, 
     // per the navigation drawer design guidelines. 
     if (!mUserLearnedDrawer && !mFromSavedInstanceState) { 
      mDrawerLayout.openDrawer(mFragmentContainerView); 
     } 

     // Defer code dependent on restoration of previous instance state. 
     mDrawerLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       mDrawerToggle.syncState(); 
      } 
     }); 

     mDrawerLayout.setDrawerListener(mDrawerToggle); 
    } 

    private void selectItem(int position) { 
     mCurrentSelectedPosition = position; 
     if (mDrawerListView != null) { 
      mDrawerListView.setItemChecked(position, true); 
     } 
     if (mDrawerLayout != null) { 
      mDrawerLayout.closeDrawer(mFragmentContainerView); 
     } 
     if (mCallbacks != null) { 
      mCallbacks.onNavigationDrawerItemSelected(position); 
     } 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mCallbacks = (NavigationDrawerCallbacks) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(
        "Activity must implement NavigationDrawerCallbacks."); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mCallbacks = null; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     // Forward the new configuration the drawer toggle component. 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // If the drawer is open, show the global app actions in the action bar. 
     // See also 
     // showGlobalContextActionBar, which controls the top-left area of the 
     // action bar. 
     if (mDrawerLayout != null && isDrawerOpen()) { 
      inflater.inflate(R.menu.global, menu); 
      showGlobalContextActionBar(); 
     } 
     super.onCreateOptionsMenu(menu, inflater); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (mDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 

     if (item.getItemId() == R.id.action_example) { 
      Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT) 
        .show(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * Per the navigation drawer design guidelines, updates the action bar to 
    * show the global app 'context', rather than just what's in the current 
    * screen. 
    */ 
    private void showGlobalContextActionBar() { 
     ActionBar actionBar = getActionBar(); 
     actionBar.setDisplayShowTitleEnabled(true); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
     actionBar.setTitle(R.string.app_name); 
    } 

    private ActionBar getActionBar() { 
     return getActivity().getActionBar(); 
    } 

    /** 
    * Callbacks interface that all activities using this fragment must 
    * implement. 
    */ 
    public static interface NavigationDrawerCallbacks { 
     /** 
     * Called when an item in the navigation drawer is selected. 
     */ 
     void onNavigationDrawerItemSelected(int position); 
    } 
} 

我收到错误,并且它不适用于可扩展列表视图。 我一直在为此工作五天,没有得到任何互联网帮助。 请帮帮我!如何在导航抽屉中创建子菜单

您必须在导航抽屉内使用可展开的ListView。

请参阅本Expandable List in Navigation Drawer

使用setGroupData()setChildGroupData()功能从主要活动TI初始化列表。

+0

你为什么不在这里添加代码链接不存在 – Shailesh