Xamarin Android中ViewStub仅生效一次,再次调用触发空指针异常求因
为什么ViewStub再次调用会触发空指针异常?
嘿,这个问题我之前也踩过坑!核心原因是ViewStub是一次性组件——当你调用Inflate()方法后,它会把自己从视图树中彻底移除,替换成你指定的布局内容。
问题根源分析
看你的代码:
第一次调用时,FindViewById<ViewStub>(Resource.Id.stub)能正常找到ViewStub,调用Inflate()后,这个ViewStub就被overview布局的视图替换掉了,原来的Resource.Id.stub对应的ViewStub已经不存在于布局树中了。
第二次再尝试FindViewById<ViewStub>(Resource.Id.stub),返回的必然是null,接着调用stub.LayoutResource或者stub.Inflate()自然就触发空指针异常了。
解决方案
根据你的需求(动态切换布局),这里有几个可行的方案:
方案1:用ViewGroup容器替代ViewStub(推荐)
把原来的ViewStub换成一个FrameLayout(或其他ViewGroup),保持id不变,然后通过动态添加/移除子视图来切换布局:
// 切换布局的通用方法 private void SwitchLayout(int layoutId) { var container = FindViewById<FrameLayout>(Resource.Id.stub_container); // 先清空容器内的所有视图 container.RemoveAllViews(); // Inflate新布局并添加到容器中 View newView = LayoutInflater.Inflate(layoutId, container, false); container.AddView(newView); } // 调用示例:切换到overview布局 SwitchLayout(Resource.Layout.overview); // 调用示例:切换到product_view布局 SwitchLayout(Resource.Layout.product_view);
方案2:提前Inflate所有布局,通过显示/隐藏切换
如果需要保留不同布局的状态(比如输入内容、滚动位置),可以提前Inflate所有需要的布局,然后通过View.Visibility来控制显示:
// 全局变量保存两个布局的引用 private View _overviewView; private View _productView; // 初始化时Inflate布局 private void InitializeLayouts() { // Inflate overview布局 var stub = FindViewById<ViewStub>(Resource.Id.stub); stub.LayoutResource = Resource.Layout.overview; _overviewView = stub.Inflate(); // Inflate product_view布局到临时容器(避免直接添加到视图树) _productView = LayoutInflater.Inflate(Resource.Layout.product_view, null); } // 切换布局方法 private void ShowOverview() { _overviewView.Visibility = ViewStates.Visible; _productView.Visibility = ViewStates.Gone; // 如果_productView还没添加到容器,先添加 if (_productView.Parent == null) { var container = FindViewById<ViewGroup>(Resource.Id.stub_container); container.AddView(_productView); } } private void ShowProductView() { _overviewView.Visibility = ViewStates.Gone; _productView.Visibility = ViewStates.Visible; }
注意:ViewStub本身无法重复Inflate
ViewStub的设计初衷就是用来延迟加载一次性的视图,它只能被Inflate一次,Inflate后就会被销毁并替换成目标视图,所以不要尝试重复使用同一个ViewStub实例或者再次通过id查找它。
内容的提问来源于stack exchange,提问作者Mike Irish
相关产品推荐
相关产品推荐

