Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.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 添加充气按钮时的NPE_Android_Android Layout - Fatal编程技术网

Android 添加充气按钮时的NPE

Android 添加充气按钮时的NPE,android,android-layout,Android,Android Layout,我尝试以编程方式创建新按钮,并将其添加到现有的视图组中(我从自定义移动到经典的线性布局,以确保bug不在自定义视图组中) 代码很简单,它在不同的用例中工作: private void appendTile() { View view = getLayoutInflater().inflate(R.layout.template_tile, null); view.setId(View.generateViewId()); view.setOnClickListener(t

我尝试以编程方式创建新按钮,并将其添加到现有的视图组中(我从自定义移动到经典的线性布局,以确保bug不在自定义视图组中)

代码很简单,它在不同的用例中工作:

private void appendTile() {
    View view = getLayoutInflater().inflate(R.layout.template_tile, null);
    view.setId(View.generateViewId());
    view.setOnClickListener(tileListener);
    hiddenPicture.addView(view, view.getLayoutParams());
}
template_tile.xml:

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
style="@style/FormulaValue" />

我转到ViewGroups构造函数,它从null参数读取宽度。在我的活动中我应该做什么不同的事情?为什么未设置XML中的布局宽度?

布局参数来自父对象。由于使用空父级进行膨胀,因此视图还没有布局参数

替换

addView(view, view.getLayoutParams())


不要自己提供布局参数,让框架为您生成布局参数。

布局参数来自父对象。由于使用空父级进行膨胀,因此视图还没有布局参数

替换

addView(view, view.getLayoutParams())


不要自己提供布局参数,让框架为您生成布局参数。

LayoutParams
特定于容器(即
ViewGroup
)。由于在没有
root
参数的情况下进行膨胀,因此,在不知道容器类型的情况下,根本没有“正确”的方法来创建
布局参数的合适实例

要使用XML中的布局参数,充气时需要提供根
ViewGroup

View view = getLayoutInflater().inflate(
    R.layout.template_tile,
    hiddenPicture,
    false // don't attachToRoot
);
view.setId(View.generateViewId());
view.setOnClickListener(tileListener);
hiddenPicture.addView(view, view.getLayoutParams());
注意,第三个参数
attachToRoot
在这里是
false
。如果将其设置为
true
,充气视图将自动附加到其父容器,从而简化典型情况

但是,当
attachToRoot==true
时,
inflate()
的返回值不是
按钮
实例,而是
隐藏图片
,即提供的受影响层次结构的根
视图


在这种情况下,永远不要直接访问
按钮
对象。由于您在充气按钮上执行手动设置(附加侦听器,设置ID),因此手动附加更简单。

布局参数
特定于容器(即
视图组
)。由于在没有
root
参数的情况下进行膨胀,因此,在不知道容器类型的情况下,根本没有“正确”的方法来创建
布局参数的合适实例

要使用XML中的布局参数,充气时需要提供根
ViewGroup

View view = getLayoutInflater().inflate(
    R.layout.template_tile,
    hiddenPicture,
    false // don't attachToRoot
);
view.setId(View.generateViewId());
view.setOnClickListener(tileListener);
hiddenPicture.addView(view, view.getLayoutParams());
注意,第三个参数
attachToRoot
在这里是
false
。如果将其设置为
true
,充气视图将自动附加到其父容器,从而简化典型情况

但是,当
attachToRoot==true
时,
inflate()
的返回值不是
按钮
实例,而是
隐藏图片
,即提供的受影响层次结构的根
视图


在这种情况下,永远不要直接访问
按钮
对象。由于您在充气按钮上执行手动设置(附加侦听器,设置ID),手动附加更简单。

我可能错了,但这不是简单地忽略XML中的任何布局参数并为容器生成默认的
LayoutParams
?是的,所有布局属性都没有效果。我不知道OP期望什么,但这是摆脱NPE的一种方法。在你的回答中,向父母夸大是另一回事。虽然手动添加视图并不能真正增加价值;也可以让充气步骤进行添加。
inflate()
返回提供的根视图,而不是
按钮,当
attachToRoot=true
时。如果您需要对膨胀的
按钮进行任何“调整”(如附加侦听器),手动附加实际上是更简单的方法;但是按钮没有显示。OP希望版面宽度和高度按照XML的定义设置,并且没有NPE。我可能错了,但这不是简单地忽略XML中的任何版面参数并为容器生成默认的
LayoutParams
?是的,所有的版面属性都没有效果。我不知道OP期望什么,但这是摆脱NPE的一种方法。在你的回答中,向父母夸大是另一回事。虽然手动添加视图并不能真正增加价值;也可以让充气步骤进行添加。
inflate()
返回提供的根视图,而不是
按钮,当
attachToRoot=true
时。如果您需要对膨胀的
按钮进行任何“调整”(如附加侦听器),手动附加实际上是更简单的方法;但是按钮没有显示。OP希望版面宽度和高度按照XML的定义进行设置,并且不会出现NPE。谢谢,它可以工作。我很高兴我现在知道了更多的细节。谢谢,它起作用了。我很高兴现在知道了更多的细节。