gpt4 book ai didi

android - 将值传递给android中的自定义 View

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:14 26 4
gpt4 key购买 nike

干杯,

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

注意:

  • 应在 View 尝试绘制自身之前收到这 2 个值。
  • 这 2 个值不是常量,因此我认为 XML 方法没有帮助。
  • 有人告诉我,向 View 构造函数添加另一个参数是邪恶的。
  • 不要将我的 2 个值与 canvas.getWidth 等混淆。这些值只需要绘制一些东西,没有别的。
  • 我的 View 也是一个 ViewGroup。
  • 主要问题出现在 XML 文件中声明的 View 。

我通过创建一个包含这两个静态值的 SchemeContext 类暂时解决了这个问题,我只是将它们设置在 onCreate(在 onCreateView 之前)中,然后在需要时在自定义 View onDraw 中使用它们(SchemeContext.width)。这并不是人们所谓的 OOP,我在 java 上强制使用全局变量,并且由于 fragment 生命周期,这些变量会按时设置。

我看过这个答案How to pass variables to custom View before onDraw() is called? .

但这更像是一种变通方法而不是解决方案(而且可能不是最快的解决方案)。必须有一个明智的解决方案,我认为 Android 上的 3D 游戏不会求助于这些解决方法(带有 OpenGL 的 SurfaceView 仍然是一个 View ,对吗?:d)。

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

最佳答案

我还没有尝试过,但我认为可以通过覆盖 LayoutInflater.Factory 来相当干净地完成此操作。这样,您就可以拦截需要将额外参数传递给其构造函数的 View 的创建,并让其余参数陷入默认膨胀。

例如,在您的 Activity 中,在扩充 View 层次结构之前:

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;
}

关于android - 将值传递给android中的自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28976625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com