通常,视图是一个实例变量,并在onCreateView
方法中初始化,如下面示例中的TextView
所示
private TextView recipeTitle;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_recipe_detail, container, false);
recipeTitle = (TextView) view.findViewById(R.id.text_title);
return view;
}
public void setRecipeTitle(String recipeTitle) {
this.recipeTitle.setText(recipeTitle);
}
是否有任何不利之处是没有使TextView
成为实例变量而只是从所需的方法访问它,如下所示?
public void setRecipeTitle(String recipeTitle) {
if (getView() != null) {
((TextView) getView().findViewById(R.id.text_title)).setText(recipeTitle);
}
}
答案 0 :(得分:2)
findViewById
不是你能做的最便宜的电话。我们鼓励您仅在必要时使用它。
但是只要你不经常调用setRecipeTitle
,就不会太糟糕了。
但是防御性编码通常更安全,因为自定义视图的用户可能不知道调用它比他们习惯的更昂贵。
总结:任何一种代码模式都可行;前一个模式(首先保存findViewById
查找)将是一个稍好的模式,但在这种特定情况下不会太多。
编辑:为什么在onCreateView
中执行此操作更好的另一个原因是,您可以进行更简单的空检查。在后一个例子中,正如问题中所写,如果在onCreateView处于Android生命周期之前调用它,setRecipeTitle
将抛出一个空引用异常。 (一个罕见的情况;不确定为什么你在单元测试期间会发生意外?无论如何,Android框架生命周期充满了这些空引用问题而没有任何编译时安全性......叹息。)但是如果你设置了成员onCreateView
中的变量(在前一个例子中),那么你可以只检查那个null,而不是将后一个例子固定为null来检查整个调用链(所有这些都可以在各种情况下返回null)。
答案 1 :(得分:1)
您可以在父视图夸大后随时调用findViewById()
。但是,它非常昂贵。如果您使用第二个示例并经常致电setRecipeTitle()
,则会看到您应用的效果受到重大影响。