【问题标题】:Android: Why are all items in my alert dialog null?Android:为什么我的警报对话框中的所有项目都为空?
【发布时间】:2015-12-02 18:58:46
【问题描述】:

我正在构建一个带有 3 个文本字段、2 个按钮和 1 个微调器下拉框的警报对话框。此布局位于“custom_dialog.xml”中。

但是,当它弹出时,所有项目都是空的。我得到一个空指针异常。如果我添加如下所示的 if 条件,则会显示警报对话框,如果没有,我会在微调器和按钮上获得空指针异常。

这里是代码;请注意,在 MainActivity 中长按当前视图时会显示警报。

View promptsView = li.inflate(R.layout.custom_dialog, null);
AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
alert.setView(promptsView); 
alert.setIcon(R.drawable.airside);
alert.setTitle("Calculate Distance To");
final TextView from = new TextView(MainActivity.this);
from.setText("From: "+item.getTitle1());
final TextView to1 = new TextView(MainActivity.this);
to1.setText("To: "+item.getTitle1());
final TextView result = (TextView) dialog.findViewById(R.id.txt3);
final AlertDialog alertDialog = alert.create();
final Button btn1 = (Button) dialog.findViewById(R.id.btn1);
final Button btn2 = (Button) dialog.findViewById(R.id.btn2);


ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_spinner_item,airNames);
Spinner spinner = (Spinner) findViewById(R.id.spinner1);
if (spinner!=null){
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener( new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
toLat=items.get(position).getPosition().latitude;
toLon=items.get(position).getPosition().longitude;
}
 @Override
public void onNothingSelected(AdapterView<?> parent) {

}
});
}

if (btn1!=null)
btn1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Double dist=calculateDistance(fromLon,fromLat,toLon,toLat);
result.setText(dist.toString());

}

});
if (btn2!=null)
btn2.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialog.dismiss();

}

});

alert.show();

请检查我如何使用微调器、btn1 和 btn2 添加 if 条件。这意味着每次我运行它时它们都是空的。加上if条件,弹出警告对话框,我看到了所有的警告框。

编辑1:

Logcat 错误(删除了上面的 if 命令);

12-02 14:44:17.305: E/OK(7093): LONGCLICKED
12-02 14:44:17.335: E/AndroidRuntime(7093): FATAL EXCEPTION: main
12-02 14:44:17.335: E/AndroidRuntime(7093): Process: com.mapsupport, PID: 7093
12-02 14:44:17.335: E/AndroidRuntime(7093): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.mapsupport.MainActivity$2.onMapLongClick(MainActivity.java:457)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.google.android.gms.maps.GoogleMap$9.onMapLongClick(Unknown Source)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.google.android.gms.maps.internal.zzk$zza.onTransact(Unknown Source)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at android.os.Binder.transact(Binder.java:380)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.google.android.gms.maps.internal.bb.a(SourceFile:93)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.google.maps.api.android.lib6.gmm6.c.ac.a(Unknown Source)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.google.maps.api.android.lib6.gmm6.m.bt.f(Unknown Source)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.google.maps.api.android.lib6.gmm6.m.ak.onLongPress(Unknown Source)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.google.maps.api.android.lib6.d.g.onLongPress(Unknown Source)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.google.maps.api.android.lib6.d.h.c(Unknown Source)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.google.maps.api.android.lib6.d.i.handleMessage(Unknown Source)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at android.os.Handler.dispatchMessage(Handler.java:102)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at android.os.Looper.loop(Looper.java:135)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at android.app.ActivityThread.main(ActivityThread.java:5375)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at java.lang.reflect.Method.invoke(Native Method)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at java.lang.reflect.Method.invoke(Method.java:372)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:911)
12-02 14:44:17.335: E/AndroidRuntime(7093):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

【问题讨论】:

  • 如果您需要帮助,请发布您的 LogCat。
  • 我没有看到 items 在任何地方定义或在其中添加任何内容。
  • items 添加,大小为 140。问题是 spinner,btn1,btn2 都是 null。我已经发布了 LogCat,请检查。

标签: android android-layout nullpointerexception android-spinner android-alertdialog


【解决方案1】:

NPE 发生是因为微调器在对话框的布局中,而不是在 Activity 的布局中。

添加:

alertDialog.show();

在这行代码之后:

final AlertDialog alertDialog = alert.create();

然后在 您在 alertDialog 上调用 show() 方法之后初始化所有视图,而不是在 之前

TextView result = (TextView) promptsView.findViewById(R.id.txt3);
Spinner spinner = (Spinner) promptsView.findViewById(R.id.spinner1);
final Button btn1 = (Button) promptsView.findViewById(R.id.btn1);
final Button btn2 = (Button) promptsView.findViewById(R.id.btn2);

还要确保从代码的末尾删除这一行:

alert.show();

【讨论】:

  • 我改变了它,仍然得到同样的错误:“12-02 14:55:46.120: E/AndroidRuntime(9267): FATAL EXCEPTION: main 12-02 14:55:46.120: E/ AndroidRuntime(9267): 进程: com.mapsupport, PID: 9267 12-02 14:55:46.120: E/AndroidRuntime(9267): java.lang.NullPointerException: 尝试调用虚拟方法'void android.widget.Spinner.setAdapter (android.widget.SpinnerAdapter)' 在空对象引用上“
  • 成功了,谢谢。是的,我在 create 方法之后移动了我的 alert.show(),并正确初始化了我的文本视图。抱歉,我忘了从 XML 中引用它们的文本视图!
  • 你知道如何关闭警告框吗?诸如“alert.dismiss();”之类的东西不存在?
  • 它是 alertDialog.dismiss();
  • 我删除了所有对 alertDialog 的引用。我使用的是“alert”变量——“AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this); 然后是 alert.create 和 alert.show...”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多