我最近从CyanogenMod项目分叉Apollo进行实验,这个应用程序主要使用自定义视图进行主题化。我使用AndroidStudio这个IDE需要自定义视图来实现View.isInEditMode()方法以在编辑布局时绕过上下文加载。
所以我有这样的事情:
public class CustomButton extends ImageButton
implements OnClickListener, OnLongClickListener {
private final SomeUtililtyClass mResources;
public CustomButton(final Context context, final AttributeSet attrs) {
super(context, attrs);
// Handle editing layout from IDE
if(!isInEditMode()) {
mResources = new SomeUtililtyClass(context);
// do more stuff
}
// some methods
}
问题是我有一些使用mResources的方法并不总是初始化,这给我一个Java编译器错误。 有一种标准的方法来处理这个问题,还是应该将mResources初始化为null或空对象? 删除最终的修饰符是必要的吗?
答案 0 :(得分:0)
这不是一种标准的方法或技巧,它取决于你。
当您的类在IDE下实例化(该类实际执行)时, View.isInEditMode()
返回true,因此它是运行时方法而不是编译器已知值。
如果你提议,初始化为null
并删除final
会这样做,看起来很简单。或者,如果你想保留final
关键字,你可以传递NULL
SomeUtilityClass
构造函数的isInEditMode()
上下文if (isInEditMode()) return;
并使其返回而不执行冲突操作
根据我的经验,通常在构造函数的第一行中进行
onDraw
足以满足大多数课程的需要。但是,如果您的课程执行自定义绘图(draw
/ dispatchDraw
/ {{1}}),您也需要在那里查看。
目前Eclipse似乎没有处理点击处理程序,但这可能在将来发生变化。