我的应用程序使用底部导航,是3个选项卡。片段在supportFragmentManager启动时创建。向用户显示第一个片段(标签)。我想在第三个片段(第三个选项卡)上的按钮上挂钩按钮处理程序。
该应用只有一项活动。从这个活动开始,在OnCreate方法中,在创建了3个片段之后,我打电话给
myButton= FindViewById<Button>(Resource.Id.theButton);
代码运行,但由于myButton始终为null,我无法将处理程序挂钩!就像UI尚未为此片段做好准备一样,因为它正在显示当前的第一个片段。
还有另一个我可以挂钩处理程序的事件吗?我不能在片段的代码中添加处理程序表单。总是得到一个空!
由于我从头开始试图找出问题的测试项目,我没有过度使用复制粘贴以获得新的解决方案。奇怪的是,该测试解决方案正在运行。很惊讶?不是我猜的!
但是为了向任何可能遇到同样问题的人解释我做过实验,这里症状是什么以及我如何解决它。
当我在片段的OnCreateView方法中使用视图时,如下所示:
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var ignored = base.OnCreateView(inflater, container, savedInstanceState);
var view = inflater.Inflate(Resource.Layout.fragment_options, null);
myButton = (Button)view.FindViewById(Resource.Id.Button1);
myButton.SetOnClickListener(this);
return view;
}
view.FindViewById总是返回Null,即使在intellisense中,“Resource.Id.Button1”就在那里并自动完成!
事实证明,Button1在片段的布局文件中定义如下
<Button id="@+id/Button1"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:text ="Test"
/>
而不是
<Button android:id="@+id/Button1"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:text ="Test"
/>
本来应该的。一个正确命名的“id”属性!
最终结果是“Button1”确实在资源文件中,因此“intellicompleted”但没有正确命名空间!而且,是的,有编译器警告我应该更仔细地查看。警告确实让我了解了这个问题。
键盘背后的问题就在于此!希望这个解释能像我一样对任何人有所帮助!