导航抽屉与主页android xamarin中的选项卡

时间:2017-08-20 19:19:53

标签: c# android xamarin tabs navigation-drawer

我用导航抽屉制作应用程序。我想在主页面中添加一个标签,但是当我运行应用程序时,我在

中有错误
  

System.NullReferenceException:未将对象引用设置为实例   一个对象。

ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

如何添加标签? 我的代码是:

namespace NavigationDrawerLayout
{
    [Activity(Label = "NavigationDrawerLayout", Theme = "@style/Theme.DesignDemo", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : AppCompatActivity
    {

        DrawerLayout drawerLayout;
        NavigationView navigationView;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;


            // Add the tabs to Action Bar  
            AddTab("Tab One");
            AddTab("Tab Two");
            AddTab("Tab Three");
            drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout);


            // Create ActionBarDrawerToggle button and add it to the toolbar
            var toolbar = FindViewById<V7Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar(toolbar);


            var drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, Resource.String.drawer_open, Resource.String.drawer_close);
            drawerLayout.SetDrawerListener(drawerToggle);
            drawerToggle.SyncState();

            navigationView = FindViewById<NavigationView>(Resource.Id.nav_view);
            setupDrawerContent(navigationView);



        }
        private void AddTab(string tabText)
        {
            Android.App.ActionBar.Tab tab = ActionBar.NewTab();
            tab.SetText(tabText);
            tab.TabSelected += OnTabSelected;
            ActionBar.AddTab(tab);
        }
        private void OnTabSelected(object sender, Android.App.ActionBar.TabEventArgs args)
        {
            var CurrentTab = (Android.App.ActionBar.Tab)sender;

            if (CurrentTab.Position == 0)
            {

            }

            else
            {

            }
        }
        void setupDrawerContent(NavigationView navigationView)
        {
            navigationView.NavigationItemSelected += (sender, e) => {
                e.MenuItem.SetChecked(true);
                drawerLayout.CloseDrawers();
            };
        }

        public override bool OnCreateOptionsMenu(IMenu menu)
        {

            navigationView.InflateMenu(Resource.Menu.nav_menu);
            return true;

        }

        }
}

main.axml

    <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v4.widget.DrawerLayout xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/drawer_layout"
        android:layout_height="match_parent"
        android:layout_width="fill_parent"
        android:fitsSystemWindows="true">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <include
                layout="@layout/toolbar" />
        </LinearLayout>
        <android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:layout_height="match_parent"
            android:layout_width="300dp"
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header" />
    </android.support.v4.widget.DrawerLayout>
</LinearLayout>

styles.xml

<?xml version="1.0" encoding="utf-8" ?>
<resources>

  <style name="Theme.DesignDemo" parent="Base.Theme.DesignDemo">
  </style>

  <style name="Base.Theme.DesignDemo" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/ColorPrimary</item>
    <item name="colorPrimaryDark">@color/ColorPrimaryDark</item>
     </style>


</resources>

1 个答案:

答案 0 :(得分:0)

  

System.NullReferenceException:未将对象引用设置为对象的实例。

如果您想添加ActionBar标签,则Activity应首先ActionBar,但在您的Theme.DesignDemo中,您已在Activity中将其删除}:

<style name="Base.Theme.DesignDemo" parent="Theme.AppCompat.Light.NoActionBar">

这意味着您无法获得ActionBar中的Activity,而是使用了Toolbar。这就是它抛出NullReferenceException例外的原因。

  

如何添加标签?

使用API​​ 21,方法ActionBarNavigationMode.Tabsdeprecated。您可以在设计支持库中使用TabLayout

它的使用非常简单,您可以将它添加到toolbar.axml中,如下所示:

Toolbar.axml

<?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"
     ...
     >
  <android.support.design.widget.AppBarLayout
       ...
       android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

     <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:elevation="4dp"
        android:background="@color/colorPrimary" />

     <android.support.design.widget.TabLayout
        android:id="@+id/tablayout"
        android:layout_height="wrap_content"
        android:layout_width="match_parent">
        <android.support.design.widget.TabItem
            android:text="Tab One"/>
        <android.support.design.widget.TabItem
            android:text="Tab Two"/>
        <android.support.design.widget.TabItem
            android:text="Tab Three"/>
     </android.support.design.widget.TabLayout>

 </android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>

在您的代码中使用它:

TabLayout tabLayout = FindViewById<TabLayout>(Resource.Id.tablayout);
tabLayout.SetupWithViewPager(viewPager);
//The one-stop shop for setting up this TabLayout with a ViewPager

这是effect。有关详细信息,请阅读此document