Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中将值传递给自定义视图_Android_Android Custom View - Fatal编程技术网

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

在android中将值传递给自定义视图,android,android-custom-view,Android,Android Custom View,干杯 我有一个接收用户输入(2个数字,宽度和高度)的应用程序,理论上,根据输入,我有一个自定义视图,可以绘制网格(宽度和高度) 注: 在视图尝试绘制自身之前,应收到这两个值 这两个值不是常数,因此我认为XML方法没有帮助 我被告知向视图构造函数添加另一个参数是邪恶的 不要将我的2个值与canvas.getWidth等混淆。。这些都是简单地画一些东西所需要的值,而不是别的 我的视图也是一个视图组 主要问题出现在XML文件中声明的视图中 我通过创建一个SchemeContext类暂时解决了这个问

干杯

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

注:

  • 在视图尝试绘制自身之前,应收到这两个值
  • 这两个值不是常数,因此我认为XML方法没有帮助
  • 我被告知向视图构造函数添加另一个参数是邪恶的
  • 不要将我的2个值与canvas.getWidth等混淆。。这些都是简单地画一些东西所需要的值,而不是别的
  • 我的视图也是一个视图组
  • 主要问题出现在XML文件中声明的视图中
我通过创建一个SchemeContext类暂时解决了这个问题,该类包含这两个静态值,我只需在onCreate中设置它们(在onCreateView之前),然后在需要时在定制视图onDraw中使用它们(SchemeContext.width)。这并不是人们所说的OOP,我在java上强制使用全局变量,并且由于片段生命周期的原因,这些变量是按时设置的

我看到了这个答案

但这与其说是一个解决方案,不如说是一个变通办法(而且可能不是最快的解决方案)。必须有一个合理的解决方案,我不认为android上的3D游戏会求助于这些解决方法(使用OpenGL的SurfaceView仍然是一个视图,对吗?:d)

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

我被告知向视图构造函数添加另一个参数是邪恶的

胡说八道

有三个(在最新的API中有四个)不同的
View
构造函数,每个构造函数用于不同的情况。(请参阅。)例如,如果希望能够用XML声明视图,则必须提供一个具有正确参数的构造函数,并让它调用相应的超类构造函数。但是,定义自己的构造函数(甚至其中的几个)并没有什么错,这些构造函数调用用于以编程方式创建视图的超类构造函数


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

我还没有尝试过这一点,但我认为可以通过重写
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;
}

在自定义视图中使用方法
设置值(int-width,int-height)
有什么问题?在
setValues(…)
中分配这些值之后,调用invalidate()`。为什么添加构造函数是邪恶的?如果您不想这样做,为什么不在将视图添加到其容器之前添加设置值?@Vikram当其构造函数返回时,每个对象都应该有效。Vikram:因为我认为它是一个额外的遍历视图组树。也许这是在小应用程序中吹毛求疵,但我认为这可能会在将来引起问题。@KevinKrumwiede,请解释一下。对于用java创建的视图,我可能同意你的看法。但是在XML中声明的视图或视图组的问题仍然存在,我不能说不应该在XML中声明自定义元素,因为这是可能的。@Spidey这个答案没有证明开发人员希望子类构造函数与超类构造函数具有完全相同的参数这一大胆的说法是正确的。我说的是用代码创建的视图。对于java代码视图,你是对的。我仍然对XML部件有问题。@Spidey我以为你说过你不能使用XML,因为参数在运行时来自用户。如果希望允许XML声明,则必须提供一个构造函数,该构造函数只接受
上下文
属性集
,而不接受其他内容。有关如何创建自定义属性的信息,请参阅。我的参数确实来自运行时的用户,我的具体情况是,我创建了一个自定义视图组,并用XML声明该视图组,以将其与抽屉布局打包。这是一种糟糕的做法,因为我不明白为什么(除了传递值带来的不便)。我不应该写这个。但是,它太棒了,很有趣,我会试试,然后报告它去了哪里。