簡體   English   中英

Android:為什么我的警報對話框中的所有項目都為空?

[英]Android: Why are all items in my alert dialog null?

我正在建立一個包含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();

請檢查我如何使用Spinner,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)

之所以發生NPE,是因為微調器位於對話框的布局中,而不位於活動的布局中。

加:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM