加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Xamarin选项卡导致System.NullReferenceException

发布时间:2020-12-15 23:22:47 所属栏目:百科 来源:网络整理
导读:我正在尝试在我的Xamarin Android应用程序中实现简单的选项卡界面. 我的活动: using System;using Android.App;using Android.Content;using Android.Runtime;using Android.Views;using Android.Widget;using Android.OS;namespace SSMobile{ [Activity (L
我正在尝试在我的Xamarin Android应用程序中实现简单的选项卡界面.
我的活动:

using System;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
namespace SSMobile
{
    [Activity (Label = "Tabs",MainLauncher = false,Icon = "@drawable/icon",Theme = "@android:style/Theme.NoTitleBar")]
    public class MainActivity : Activity 
    {
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
            SetContentView (Resource.Layout.Main);

            AddTab ("Panic",Resource.Drawable.tab_icon,new PanicFragment ());
            AddTab ("Diagnostics",new DiagnosticsFragment ());
            AddTab ("Config",new ConfigFragment ());
        }

        protected override void OnSaveInstanceState(Bundle outState)
        {
            outState.PutInt("tab",this.ActionBar.SelectedNavigationIndex);

            base.OnSaveInstanceState(outState);
        }

        void AddTab (string tabText,int iconResourceId,Fragment view)
        {
            var tab = this.ActionBar.NewTab ();            
            tab.SetText (tabText);
            tab.SetIcon (Resource.Drawable.tab_icon);

            // must set event handler before adding tab
            tab.TabSelected += delegate(object sender,ActionBar.TabEventArgs e)
            {
                var fragment = this.FragmentManager.FindFragmentById(Resource.Id.fragmentContainer);
                if (fragment != null)
                    e.FragmentTransaction.Remove(fragment);         
                e.FragmentTransaction.Add (Resource.Id.fragmentContainer,view);
            };
            tab.TabUnselected += delegate(object sender,ActionBar.TabEventArgs e) {
                e.FragmentTransaction.Remove(view);
            };

            this.ActionBar.AddTab (tab);
        }

        class PanicFragment: Fragment {
            public override View OnCreateView (LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
            {
                base.OnCreateView (inflater,container,savedInstanceState);
                var view = inflater.Inflate (Resource.Layout.PanicFragment,false);
                return view;
            }
        }

        class DiagnosticsFragment: Fragment {
            public override View OnCreateView (LayoutInflater inflater,savedInstanceState);
                var view = inflater.Inflate (Resource.Layout.DiagnosticsFragment,false);
                return view;
            }
        }

        class ConfigFragment: Fragment {
            public override View OnCreateView (LayoutInflater inflater,savedInstanceState);
                var view = inflater.Inflate (Resource.Layout.ConfigFragment,false);
                return view;
            }
        }
    }
}

当我的应用程序打开该活动时,我收到错误:

System.NullReferenceException: Object reference not set to an instance
of an object

在这条线上:

this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

异常日志:

System.NullReferenceException: Object reference not set to an instance of an object
  at SSMobile.MainActivity.OnCreate (Android.OS.Bundle) [0x00009] in c:UsersdarekDocumentsProjectsSSMobileSSMobileMainActivity.cs:17
  at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) [0x00011] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.21-series/49a04b96/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.App.Activity.cs:1944
  at at (wrapper dynamic-method) object.3a5a286c-d028-4989-a49e-efabfb6b0ae6 (intptr,intptr) <IL 0x00017,0x0001f>

这段代码有什么问题?

解决方法

我找到了我无法使用ActionBar的原因.
在我的活动中,我使用隐藏TitleBar的Theme:

Theme = "@android:style/Theme.NoTitleBar"

这也使得ActionBar隐藏起来并且不可用.
因此,如果您想拥有ActionBar,则无法使用该主题.如果你仍然需要隐藏标题栏,只需添加如下内容:

this.ActionBar.SetDisplayShowHomeEnabled (false);
this.ActionBar.SetDisplayShowTitleEnabled (false);

它会隐藏应用程序图标和标题.

希望它能为您节省几个小时的搜索时间:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读