类别:.Net相关知识 / 日期:2014-10-30 / 浏览:2457 / 评论:0

由于需要,最近一直在研究实现屏幕左滑显示菜单的功能,根据网上的资料有两种解决办法,一种是使用SlidingMenu第三方控件的方法,还有一种是官方推荐的Navigation Drawer,第一种方法可以在网上找的相关的文章,我这里使用了第二种方法。 要实现这个功能,首先必须要在项目引用当中添加对Mono.Android.Support.v4.dll的引用,如下图

接下来,我们在主界面Main.axml中添加以下内容。

<?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">
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>
    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111" />
</android.support.v4.widget.DrawerLayout>

上面的页面中主要分成了两个部分,一个是FrameLayout,用于显示主要的内容,另一个ListView则用于显示左边划出的菜单列表。 接下来,我们需要定义几个Fragment,菜单中点击某项就显示出某Fragment中所渲染的页面。  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;

namespace Demo2.Fragments
{
    public class MainFragment : Fragment
    {
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            var rootView = inflater.Inflate(Resource.Layout.FragmentMain, container, false);
            return rootView;
        }
    }
}

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:text="主界面"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView1"
        android:gravity="center" />
</LinearLayout>

以上定义的是主界面,当程序启动的时候默认显示该页面,同时还新建了3个其他页面,以便在菜单栏中点击后可以显示。 接下来,我们需要定义一个菜单栏中的每一项所用的模板,我就简单定义了,代码如下。  

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:textColor="#fff"
    android:background="?android:attr/activatedBackgroundIndicator"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:textSize="30px" />

下面是主界面的MainActivity中的代码。

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Support.V4.Widget;
using Android.Views;
using Android.Widget;
using Android.OS;
using Demo2.Fragments;

namespace Demo2
{
    [Activity(Label = "Demo2", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        private DrawerLayout _drawer;
        private ListView _drawerList;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.Main);

            string[] titiles = { "主界面", "治疗", "免疫", "保健" };

            _drawer = FindViewById<DrawerLayout>(Resource.Id.drawer_layout);
            _drawerList = FindViewById<ListView>(Resource.Id.left_drawer);
            _drawerList.Adapter = new ArrayAdapter<string>(this, Resource.Layout.DrawerListItem, titiles);
            _drawerList.ItemClick += darwerList_ItemClick;

            if (null == bundle)
            {
                var tfragment = new MainFragment();
                FragmentManager.BeginTransaction().Replace(Resource.Id.content_frame, tfragment).Commit();
                _drawerList.SetItemChecked(0, true);
                _drawer.CloseDrawer(_drawerList);
            }

        }

        void darwerList_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
        {
            if (e.Position == 1)
            {
                var tfragment = new TreatmentFragment();
                FragmentManager.BeginTransaction().Replace(Resource.Id.content_frame, tfragment).Commit();
                _drawerList.SetItemChecked(e.Position, true);
                _drawer.CloseDrawer(_drawerList);
            }
            else if (e.Position == 2)
            {
                var ifragment = new ImmunityFragment();
                FragmentManager.BeginTransaction().Replace(Resource.Id.content_frame, ifragment).Commit();
                _drawerList.SetItemChecked(e.Position, true);
                _drawer.CloseDrawer(_drawerList);
            }
            else if (e.Position == 3)
            {
                var tfragment = new HealthFragment();
                FragmentManager.BeginTransaction().Replace(Resource.Id.content_frame, tfragment).Commit();
                _drawerList.SetItemChecked(e.Position, true);
                _drawer.CloseDrawer(_drawerList);
            }
            else
            {
                var tfragment = new MainFragment();
                FragmentManager.BeginTransaction().Replace(Resource.Id.content_frame, tfragment).Commit();
                _drawerList.SetItemChecked(e.Position, true);
                _drawer.CloseDrawer(_drawerList);
            }
        }
    }
}

这段代码比较关键的就是,从Main页面中获取到了用于显示区域的_drawer,和用于导航区域显示的_drawerList,设置导航区域显示的内容为titiles数组,默认进入页面显示MainFragment中的内容,通过定义drawerList的ItemClick事件,从而达到点击不用的项显示不同的页面的功能。 下面是程序运行的截图:

可能感兴趣的文章

评论区

发表评论 /

必填

选填

选填

◎欢迎讨论,请在这里发表您的看法及观点。