在所有活动中调用导航抽屉

时间:2013-11-25 17:43:26

标签: java android xml

我有一个NavigationDrawer,我将其称为Activity,而无需在不同的类中复制和粘贴相同的代码。因此,我必须将所有代码粘贴到各个类中,我将其放在自己的类中,称为NavDrawer。这是代码。

NavDrawer

public class NavDrawer extends Activity{

     ListView mDrawerList;
     DrawerLayout mDrawer;
     CustomActionBarDrawerToggle mDrawerToggle;
     String[] menuItems;
     Intent intent, intent2, intent3, intent4, intent5, intent6;

     public void _initMenu() {
         NsMenuAdapter mAdapter = new NsMenuAdapter(this);

         // Add Header
         mAdapter.addHeader(R.string.ns_menu_main_header);

         // Add first block

         menuItems = getResources().getStringArray(
                         R.array.ns_menu_items);
         String[] menuItemsIcon = getResources().getStringArray(
                         R.array.ns_menu_items_icon);

         int res = 0;
         for (String item : menuItems) {

                 int id_title = getResources().getIdentifier(item, "string",
                                 this.getPackageName());
                 int id_icon = getResources().getIdentifier(menuItemsIcon[res],
                                 "drawable", this.getPackageName());

                 NsMenuItemModel mItem = new NsMenuItemModel(id_title, id_icon);
                 mAdapter.addItem(mItem);
                 res++;
         }
         mDrawerList = (ListView) findViewById(R.id.drawer);
         if (mDrawerList != null)
                 mDrawerList.setAdapter(mAdapter);

         mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

 }


     @Override
     protected void onPostCreate(Bundle savedInstanceState) {
             super.onPostCreate(savedInstanceState);
             // Sync the toggle state after onRestoreInstanceState has occurred.
             mDrawerToggle.syncState();
     }

     @Override
     public void onConfigurationChanged(Configuration newConfig) {
             super.onConfigurationChanged(newConfig);
             mDrawerToggle.onConfigurationChanged(newConfig);
     }

     @Override
    public boolean onCreateOptionsMenu(Menu menu) {
     MenuInflater inflater = getMenuInflater();
     inflater.inflate(R.menu.main, menu);
     return super.onCreateOptionsMenu(menu);
    }

    /* Called whenever we call invalidateOptionsMenu() */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
     // If the nav drawer is open, hide action items related to the content view
     boolean drawerOpen = mDrawer.isDrawerOpen(mDrawerList);
     //menu.findItem(R.id.item1).setVisible(!drawerOpen);
     return super.onPrepareOptionsMenu(menu);
    }

     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
             /*
              * The action bar home/up should open or close the drawer.
              * ActionBarDrawerToggle will take care of this.
              */
             if (mDrawerToggle.onOptionsItemSelected(item)) {
                     return true;
             }

             // Handle your other action bar items...
             return super.onOptionsItemSelected(item);
     }

     private class CustomActionBarDrawerToggle extends ActionBarDrawerToggle {

             public CustomActionBarDrawerToggle(Activity mActivity,DrawerLayout mDrawerLayout){
                     super(
                      mActivity,
                      mDrawerLayout,
                      R.drawable.ic_drawer,
                      R.string.ns_menu_open,
                      R.string.ns_menu_close);
             }

             @Override
             public void onDrawerClosed(View view) {
                     getActionBar().setTitle(getString(R.string.ns_menu_close));
                     invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
             }

             @Override
             public void onDrawerOpened(View drawerView) {
                     getActionBar().setTitle(getString(R.string.ns_menu_open));
                     invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
             }
     }

     private class DrawerItemClickListener implements ListView.OnItemClickListener {

         @Override
         public void onItemClick(AdapterView<?> parent, View view, int position,
                         long id) {
                 // Highlight the selected item, update the title, and close the drawer
                 // update selected item and title, then close the drawer
  mDrawerList.setItemChecked(position, true);

  if(position==0) {
            //Open an Activity
  }

  if(position==1) {
            //Open an Activity
}

  if(position==2) {
            //Open an Activity
}

  //You should reset item counter
  mDrawer.closeDrawer(mDrawerList);

         }

 }

     @Override
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.examplelayout);

     getActionBar().setDisplayHomeAsUpEnabled(true);

     mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);

     mDrawer.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

     _initMenu();
     mDrawerToggle = new CustomActionBarDrawerToggle(this, mDrawer);
     mDrawer.setDrawerListener(mDrawerToggle);

     _initMenu();

     mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
     }

}

NsMenuAdapter

public class NsMenuAdapter extends ArrayAdapter<NsMenuItemModel> {

        public NsMenuAdapter(Context context) {
                super(context, 0);
        }

        public void addHeader(int title) {
                add(new NsMenuItemModel(title, -1, true));
        }

        public void addItem(int title, int icon) {
                add(new NsMenuItemModel(title, icon, false));
        }

        public void addItem(NsMenuItemModel itemModel) {
                add(itemModel);
        }

        @Override
        public int getViewTypeCount() {
                return 2;
        }

        @Override
        public int getItemViewType(int position) {
                return getItem(position).isHeader ? 0 : 1;
        }

        @Override
        public boolean isEnabled(int position) {
                return !getItem(position).isHeader;
        }

        public static class ViewHolder {
                public final TextView textHolder;
                public final ImageView imageHolder;
                public final TextView textCounterHolder;

                public ViewHolder(TextView text1, ImageView image1,TextView textcounter1) {
                        this.textHolder = text1;
                        this.imageHolder = image1;
                        this.textCounterHolder=textcounter1;
                }
        }

        public View getView(int position, View convertView, ViewGroup parent) {

                NsMenuItemModel item = getItem(position);
                ViewHolder holder = null;
                View view = convertView;

                if (view == null) {
                        int layout = R.layout.ns_menu_row_counter;
                        if (item.isHeader)
                                layout = R.layout.ns_menu_row_header;

                        view = LayoutInflater.from(getContext()).inflate(layout, null);

                        TextView text1 = (TextView) view.findViewById(R.id.menurow_title);
                        ImageView image1 = (ImageView) view.findViewById(R.id.menurow_icon);
                        TextView textcounter1 = (TextView) view.findViewById(R.id.menurow_counter);
                        view.setTag(new ViewHolder(text1, image1,textcounter1));
                }

                Object tag = view.getTag();
                if (tag instanceof ViewHolder) {
                        holder = (ViewHolder) tag;
                }


         if(item != null && holder != null)
         {
                 if (holder.textHolder != null)
                                holder.textHolder.setText(item.title);

                 if (holder.textCounterHolder != null){
                         if (item.counter > 0){
                                 holder.textCounterHolder.setVisibility(View.VISIBLE);
                         }else{
                                 holder.textCounterHolder.setVisibility(View.GONE);
                                }
                        }

         if (holder.imageHolder != null) {
                                if (item.iconRes > 0) {
                                        holder.imageHolder.setVisibility(View.VISIBLE);
                                        holder.imageHolder.setImageResource(item.iconRes);
                                } else {
                                        holder.imageHolder.setVisibility(View.GONE);
                                }
                        }
         }

         return view;                
        }

}

NsMenuItemModel

public class NsMenuItemModel {

    public int title;
    public int iconRes;
    public int counter;
    public boolean isHeader;

    public NsMenuItemModel(int title, int iconRes,boolean header,int counter) {
            this.title = title;
            this.iconRes = iconRes;
            this.isHeader=header;
            this.counter=counter;
    }

    public NsMenuItemModel(int title, int iconRes,boolean header){
            this(title,iconRes,header,0);
    }

    public NsMenuItemModel(int title, int iconRes) {
            this(title,iconRes,false);
    }



}

在我希望拥有NavigationDrawer的类中,除了扩展NavigationDrawer类之外什么都不做,所以我有这样的代码

public class ExampleClass extends NavDrawer

当我在ActionBar中运行应用程序时,可视化显示的图像和NavigationDrawer但是是EMPTY。为什么? 另外,在类NavDrawer的onCreate中我将布局设置为一个Activity的布局,但是如果我必须在ALL中看到它,则无法链接到ONE那个特定布局的特定Activity。所以我想我会专门为NavigationDrawer创建一个,只包含一个结构。代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/drawer_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >

    <!-- The navigation drawer -->

    <ListView
       android:id="@+id/drawer"
       android:layout_width="250dp"
       android:layout_height="match_parent"
       android:layout_gravity="start"
       android:background="#F3F3F4"
       android:choiceMode="singleChoice"
       android:divider="@android:color/transparent"
       android:dividerHeight="0dp" >


    </ListView>

</android.support.v4.widget.DrawerLayout>

它可以工作吗?

示例的布局具有与此

类似的结构
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/drawer_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

  <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        />

 </LinearLayout>

    <!-- The navigation drawer -->

    <ListView
       android:id="@+id/drawer"
       android:layout_width="280dp"
       android:layout_height="match_parent"
       android:layout_gravity="start"
       android:background="#F3F3F4"
       android:choiceMode="singleChoice"
       android:divider="@android:color/transparent"
       android:dividerHeight="0dp" >


    </ListView>

</android.support.v4.widget.DrawerLayout>

我希望得到所有这些问题的答案,如果我的问题看起来微不足道,我会道歉,但是我正在拼命寻求解决方案,但我不能。我希望得到答案和帮助。提前谢谢。

0 个答案:

没有答案