从自定义视图访问 RelativeLayout 时出现 NullPointerException

Posted

技术标签:

【中文标题】从自定义视图访问 RelativeLayout 时出现 NullPointerException【英文标题】:NullPointerException when accessing RelativeLayout from a custom view 【发布时间】:2013-02-01 13:34:30 【问题描述】:

我对 android 比较陌生,完全不知道如何在我的自定义视图中访问我以编程方式定义的相对布局(在片段中定义)。

在片段中,这是我所拥有的:

...
    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 

    View view = inflater.inflate(R.layout.fragment1, container,false);
    RelativeLayout rl1 = new RelativeLayout(view.getContext());
    TextView tView1 = new TextView(view.getContext()); 
    tView1.setText("test");
    rl1.addView(tView1); 
    rl1.setId(1);
    tView1.setId(2);
...

然后在自定义视图中,我通过 id 调用相对的 Layout 和 TextView。当我尝试做任何事情时,我得到一个 NullPointer 异常。

...
RelativeLayout rl1 = (RelativeLayout) findViewById(1);
TextView tView1 = (TextView) findViewById(2);
tView1.getText();

上面的代码显示尝试在 TextView 上 .getText(),但我对 RelativeLayout 所做的任何事情也会导致 NullPointer 异常。

所以基本上,看起来我没有正确找到 RelativeLayout 和 TextViews。 仅供参考,我已经看过 this similar question,但它不适用于这里,我的构造函数已经正确设置。

【问题讨论】:

好的,我已经添加了更多代码。你能给我具体的命令/文件类型来添加它吗?是不是类似于view.addView(rl1)?还是将其添加到 Fragment1 的 .xml 文件中? 在下面查看我的答案。如果你想保持这种动态,除了片段布局的初始膨胀之外,xml 并没有真正涉及。正如我所写,您需要转换为布局,因为 addView() 未为 View 类定义。 【参考方案1】:

您应该将布局添加到主视图,但是,您需要先将其转换为布局:

YourLayout view = (YourLayout) inflater.inflate(R.layout.fragment1, container,false);
RelativeLayout rl1 = new RelativeLayout(view.getContext());
TextView tView1 = new TextView(view.getContext()); 
tView1.setText("test");
rl1.addView(tView1); 
rl1.setId(1);
tView1.setId(2);
view.addView (rl1);//add rl1 to the main View

然后访问,如果你在onCreateView()之外工作onCreateView() has already been called:

RelativeLayout rl1 = (RelativeLayout) getView().findViewById(1);
TextView tView1 = (TextView) rl1.findViewById(2);
tView1.getText();

如果您仍在尝试访问 onCreateView() 中的视图,findViewById() 没关系 - 您已经拥有视图的引用,因此请使用它们。

另外值得注意的是,可以在onCreateView() 中添加侦听器等来更新 UI,因此您可以简单一些。

【讨论】:

你很好地为我解决了问题!无法告诉你我在这上面浪费了多少时间......【参考方案2】:

您必须将您的相对布局添加到您的布局组...并且从您的布局的父视图中,您可以访问您的相对布局及其子布局

【讨论】:

以上是关于从自定义视图访问 RelativeLayout 时出现 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

如何判断 UITabBar 是不是从自定义视图打开?

使用 sqliteDatabase 从自定义列表视图中删除项目

从自定义表格视图单元格类加载时如何调整单元格的高度?

从自定义表格视图单元格获取数据到另一个 VC?

如何从自定义视图的类中更改文本视图

使用sqliteDatabase从自定义列表视图中删除项目