我想打开一个对话框供用户从多个项目中进行选择,但是当setAdapter()
要执行时我收到错误...
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Dialog cd = new Dialog(Main1.this);
String[] mobileArray = {"Android","IPhone","WindowsMobile","Blackberry","WebOS","Ubuntu","Windows7","Max OS X"};
ArrayAdapter adapter = new ArrayAdapter<String>(cd.getContext(), R.layout.lvlayout, mobileArray);
ListView listView = (ListView) findViewById(R.id.listviewID);
listView.setAdapter(adapter);
cd.setContentView(R.layout.dialogLayout);
cd.setTitle("MEOW");
cd.show();
}
});
ListView
处于Dialog布局中。什么错在这里?
答案 0 :(得分:1)
您的代码中只有两个错误,您在调用此行而不使用cd.
作为前缀,因此您必须这样做,
ListView listView = (ListView) cd.findViewById(R.id.listviewID);
您正在做的另一个错误是在致电findViewById
之前致电setContentView()
,这也可能会提升NPE。
所以我建议你把它移动起来并像这样重新安排
cd.setContentView(R.layout.dialogLayout);
ListView listView = (ListView) cd.findViewById(R.id.listviewID);
答案 1 :(得分:0)
问题是,当您在其上调用listView
时,您的变量setAdapter()
为null。因此,对findViewById()
的调用返回null。也许你只是使用了错误的ID。
答案 2 :(得分:0)
你有一些基本的错误。
主要的错误是在代码末尾调用cd.setContentView(R.layout.dialogLayout);
。您需要在想要在该内容布局中查找内容之前调用。
另一个错误就是试图找到清单。您需要获取视图以在该视图中查找列表。这可能是这样的。
ListView listView = (ListView) cd.getView().findViewById(R.id.listviewID);
但是,我确实更喜欢以下解决方案来解决您的问题。这可能是您尝试实现的更简单的方法。
这是实现自定义对话的一个很好的例子。你可以看看这里。 https://github.com/afollestad/material-dialogs
所以,现在,当您获得NullPointerException
时,findViewById
并未返回您ListView
的任何引用。因此,通过使用上面提到的库,您可以非常轻松地实现这一目标。
// Initialize your dialogue
MaterialDialog dialog = new MaterialDialog.Builder(getActivity())
.title("MEOW")
.customView(R.layout.dialogLayout, true)
.positiveText(R.string.ok)
.negativeText(R.string.cancel)
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
dialog.dismiss();
}
})
.show();
// Now get the view of that dialogue.
View view = dialog.getCustomView();
// Initialize the array adapter
String[] mobileArray = {"Android","IPhone","WindowsMobile","Blackberry","WebOS","Ubuntu","Windows7","Max OS X"};
ArrayAdapter adapter = new ArrayAdapter<String>(cd.getContext(), R.layout.lvlayout, mobileArray);
// Get the list view and set the adapter
ListView listView = (ListView) view.findViewById(R.id.listviewID);
listView.setAdapter(adapter);
答案 3 :(得分:0)
只需在onClick侦听器之外初始化listview。 在onCreate()中初始化它是更可取的。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
// initialize
ListView listView = (ListView) findViewById(R.id.listviewID);
}