目前我正在开发一个供我自己使用的库。我在这个库中的类称为BaseWindow
,我的库项目也将SlidingMenu
项目作为库包含在内。当我尝试从布局文件夹中获取NullPointerException
时,我得到listView
。我的班级是这样构建的:
public class BaseWindow extends SlidingFragmentActivity {
private String windowTitle;
private int menuResourceId;
/**
* @param layoutResourceId identificator of the layout to inflate(R.layout.your_layout)
* @param menuResourceId identification of the menu to inflate(R.layout.your_menu)
* @param windowTitle title of this window
*/
public void InitializeWindow(int layoutResourceId, int menuResourceId, String windowTitle) {
...........
ListView lv = (ListView)findViewById(R.id.menu_listview);
}
}
我知道像这样的东西应该用onCreate
方法完成。但有可能在外面这样做,就像我一样吗?当我将鼠标指针放在findViewById
方法上时,它确实引用了我的超类中的方法
View com.slidingmenu.lib.app.SlidingFragmentActivity.findViewById(int id)
SlidingFragmentActivity
类扩展了SherlockFragmentActivity
有人知道导致问题的原因吗?我是我的lv
对象。空值?如何从这个库类中获取正确的ListView?
答案 0 :(得分:2)
您应首先对包含menu_listview
的xml进行充气:
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.xml_containing_listview);
ListView lv = (ListView) view.findViewById(R.id.menu_listview);
这只是一个概念,我没有对此进行测试,因此可能无效。你还需要有一个上下文。
答案 1 :(得分:1)
setContentView()
中onCreate
的{{1}}方法非常重要,因为它用于扩充布局并在对象中收集其视图和资源。但是,虽然创建一个单独的类并直接使用id不会使您的布局膨胀,因此有三种方法可以这样做
1)将列表视图直接传递给非活动方法
的方法2)充气布局
activity
3)直接膨胀布局并使用它
LayoutInflater inflater = LayoutInflater.from(context);
View externalView = inflater.inflate(R.layout.your_layout_containing_listview);
ListView listView = (ListView) externalView .findViewById(R.id.menu_listview);
选择最适合您代码的内容
答案 2 :(得分:0)
可能有以下几个原因:
InitializeWindow()
在setContentView()
之前被调用,活动还没有布局。
ID menu_listview
在R.layout.***
布局中不存在由活动充气。
您从错误的包(App vs Library)中引用R
。