Cheers,
我有一个接收用户输入(2 个数字,宽度和高度)的应用程序,理论上根据该输入,我有一个应该绘制网格(宽度和高度)的自定义视图。
Note:
- 应在视图尝试绘制自身之前接收这两个值。
- 这两个值不是恒定的,因此我认为 XML 方法没有帮助。
- 有人告诉我,向 View 构造函数添加另一个参数是邪恶的。
- 不要将我的 2 个值与 canvas.getWidth 等混淆。这些值只是为了绘制某些东西而需要的,没有其他值。
- 我的View也是一个ViewGroup。
- 主要问题是在 XML 文件中声明的视图引起的。
我通过创建一个包含这两个静态值的SchemeContext类暂时解决了这个问题,我只需在onCreate中(在onCreateView之前)设置它们,然后在需要时在自定义视图onDraw中使用它们(SchemeContext.width)。这并不是人们所谓的 OOP,我将全局变量强加到 java 上,并且由于片段生命周期,这些变量是按时设置的。
我看过这个答案如何在调用 onDraw() 之前将变量传递给自定义 View? https://stackoverflow.com/questions/25419176/how-to-pass-variables-to-custom-view-before-ondraw-is-called.
但它更多的是一种解决方法,而不是解决方案(而且可能不是最快的解决方案)。必须有一个明智的解决方案,我不认为 Android 上的 3D 游戏会诉诸这些解决方法(带有 OpenGL 的 SurfaceView 仍然是一个视图,对吧?:d)。
如果有一个明显的解决方案并且这是一个明显的双重,我将删除这个问题。
我还没有尝试过这个,但我认为通过覆盖可以相当干净地做到这一点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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)