干杯,
我有一个接收用户输入(2个数字,宽度和高度)的应用程序,理论上,根据该输入,我有一个应该绘制网格(宽度和高度)的自定义视图。
注意:
我暂时通过创建一个包含这2个静态值的SchemeContext类来解决这个问题,我只是在onCreate中设置它们(在onCreateView之前),然后在需要时在自定义View onDraw中使用它们(SchemeContext.width)。这并不是人们所谓的OOP我在java上强制全局变量,并且由于片段生命周期而按时设置它们。
我已经看到了这个答案How to pass variables to custom View before onDraw() is called?。
但它更像是一种解决方法而不是解决方案(可能不是最快的解决方案)。必须有一个合理的解决方案我不认为Android上的3D游戏采用这些解决方法(使用OpenGL的SurfaceView仍然是一个View?:d)。
如果有一个明显的解决方案,这是一个明显的双重,我将删除这个问题。
答案 0 :(得分:4)
我没有试过这个,但我认为可以通过覆盖LayoutInflater.Factory
来相当干净地做到这一点。这样,您可以拦截需要传递给构造函数的其他参数的视图的创建,并让其余参数进入默认通胀。
例如,在您的活动中,在扩展视图层次结构之前:
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
MyInflaterFactory factory = new MyInflaterFactory();
// Pass information needed for custom view inflation to factory.
factory.setCustomValue(42);
inflater.setFactory(factory);
为了您的工厂实施:
class MyInflaterFactory implements LayoutInflater.Factory {
public void setCustomValue(int val) {
mCustomVal = val;
}
@Override
public View onCreateView (String name, Context context, AttributeSet attrs) {
if (name.equals("com.package.ViewWithCustomCreation")) {
return new ViewWithCustomCreation(context, attrs, mCustomVal);
}
return null;
}
private int mCustomVal;
}
答案 1 :(得分:0)
我被告知在View构造函数中添加另一个参数是邪恶的。
无意义。
有三个(在最新的API中,有四个)不同的View
构造函数,每个构造函数在不同的情况下使用。 (参见this thread。)例如,如果您希望能够以XML格式声明视图,那么您必须为构造函数提供正确的参数,并让它调用相应的超类构造函数。但是定义自己的构造函数(甚至其中几个)调用用于以编程方式创建视图的超类构造函数没有任何问题。
最重要的原则是每个对象在其构造函数返回时必须是有效的。因此,除非您可以在构造函数中提供合理的默认值,否则您别无选择,只能接受对象的属性作为构造函数参数。