Xamarin FindViewById NullReference异常

1cosmwyk  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(94)

我遇到了一个问题,每当我尝试向按钮添加事件处理程序时,我都会得到一个null引用异常,我试图创建一个带有DialogFragment的弹出窗口,在里面我调用了将显示在屏幕上的视图PopUpWindow,但是当我试图通过id访问按钮并为它们分配事件处理程序时,例如:

Button btnCopyText = dp.view.FindViewById<Button>(Resource.Id.btnCopyText);
btnCopyText.Click += BtnCopyText_Click;

然后我得到一个空引用异常,有谁能帮我,下面是必要的代码。

class dialog_Popup:DialogFragment
    {
        public View view;
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            base.OnCreateView(inflater, container, savedInstanceState);
            view = inflater.Inflate(Resource.Layout.PopupWindow, container, false);
  
            return view;
        }
        public override void OnActivityCreated(Bundle savedInstanceState)
        {
            Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
            base.OnActivityCreated(savedInstanceState);

        }

    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
         //some code
        }
        public string itemclicked;
        dialog_Popup dp;

        private void Lv_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
        {
            //View popUpView = LayoutInflater.Inflate(Resource.Layout.PopupWindow,
            //null); // inflating popup layout

            Button height = FindViewById<Button>(Resource.Id.btnCopyText);
            //Then: change the width of the button
            FragmentTransaction transaction = FragmentManager.BeginTransaction();
            dp = new dialog_Popup();
            dp.Show(transaction,"Popup");

            itemclicked = lv.GetItemAtPosition(e.Position).ToString();

            Button btnCopyText = dp.view.FindViewById<Button>(Resource.Id.btnCopyText);
            btnCopyText.Click += BtnCopyText_Click;
            Button btnSaveCurrentAya = dp.view.FindViewById<Button>(Resource.Id.btnSaveCurrentAya);
            btnSaveCurrentAya.Click += BtnSaveCurrentAya_Click;
            Button btnsavingsAya = dp.view.FindViewById<Button>(Resource.Id.savingsAya);
            btnsavingsAya.Click += BtnsavingsAya_Click;*

            Button btnShareFB = dp.view.FindViewById<Button>(Resource.Id.fbShare);
            btnShareFB.Click += BtnShareFB_Click;
        }
}
gywdnpxw

gywdnpxw1#

FindViewById可能发生NullReferenceException的原因有几个:

  • 布局不包含id -〉检查正确的布局和id是否被膨胀/引用
  • 按钮类型不正确

在本例中,检查dp和dp.view是否不为null。
这里要提到的一件事是,在主视图中引用片段的控件并不是最好的实现方式。片段应该能够自己生活。所以我看到了两种实现所需行为的方法:
1)片段获取一个事件,你监听它。这意味着你的主视图将包含保存某些东西的逻辑。
2)逻辑移动到片段中。

相关问题