将值传递给android中的自定义视图

时间:2015-03-11 00:40:18

标签: android android-custom-view

干杯,

我有一个接收用户输入(2个数字,宽度和高度)的应用程序,理论上,根据该输入,我有一个应该绘制网格(宽度和高度)的自定义视图。

注意:

  • 在查看尝试绘制自身之前,应接收这两个值。
  • 这两个值不是常数,因此我认为XML方法无法提供帮助。
  • 我被告知在View构造函数中添加另一个参数是邪恶的。
  • 不要将我的2个值与canvas.getWidth等混淆。这些只是绘制内容所需的值,没有别的。
  • 我的视图也是一个ViewGroup。
  • 主要问题出现在XML文件中声明的视图。

我暂时通过创建一个包含这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)。

如果有一个明显的解决方案,这是一个明显的双重,我将删除这个问题。

2 个答案:

答案 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格式声明视图,那么您必须为构造函数提供正确的参数,并让它调用相应的超类构造函数。但是定义自己的构造函数(甚至其中几个)调用用于以编程方式创建视图的超类构造函数没有任何问题。

最重要的原则是每个对象在其构造函数返回时必须是有效的。因此,除非您可以在构造函数中提供合理的默认值,否则您别无选择,只能接受对象的属性作为构造函数参数。