在onCreateView之外初始化视图有什么缺点吗?

时间:2016-12-30 18:12:20

标签: android

通常,视图是一个实例变量,并在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);
    }
}

2 个答案:

答案 0 :(得分:2)

findViewById不是你能做的最便宜的电话。我们鼓励您仅在必要时使用它。

但是只要你不经常调用setRecipeTitle,就不会太糟糕了。

但是防御性编码通常更安全,因为自定义视图的用户可能不知道调用它比他们习惯的更昂贵。

总结:任何一种代码模式都可行;前一个模式(首先保存findViewById查找)将是一个稍好的模式,但在这种特定情况下不会太多。

编辑:为什么在onCreateView中执行此操作更好的另一个原因是,您可以进行更简单的空检查。在后一个例子中,正如问题中所写,如果在onCreateView处于Android生命周期之前调用它,setRecipeTitle将抛出一个空引用异常。 (一个罕见的情况;不确定为什么你在单元测试期间会发生意外?无论如何,Android框架生命周期充满了这些空引用问题而没有任何编译时安全性......叹息。)但是如果你设置了成员onCreateView中的变量(在前一个例子中),那么你可以只检查那个null,而不是将后一个例子固定为null来检查整个调用链(所有这些都可以在各种情况下返回null)。

答案 1 :(得分:1)

您可以在父视图夸大后随时调用findViewById()。但是,它非常昂贵。如果您使用第二个示例并经常致电setRecipeTitle(),则会看到您应用的效果受到重大影响。