NullPointerException: LinearLayout является Нулевым
Пожалуйста, посмотрите на следующий код
private class OpenFileEvent implements OnClickListener
{
@Override
public void onClick(View arg0) {
LinearLayout openFileDialogView = (LinearLayout)findViewById(R.id.open_file_dialog);
// TODO Auto-generated method stub
final Dialog openFileDialog = new Dialog(VoiceNotes.this);
openFileDialog.setTitle("Open File");
openFileDialog.setContentView(R.layout.open_dialog);
//First, list all the available Files
File folder = new File(Environment.getExternalStorageDirectory()+"/Voice/Notes/");
File file = new File(folder.getAbsolutePath());
File[] fileNameList = file.listFiles();
if(fileNameList != null && fileNameList.length>0)
{
for(int i=0;i<fileNameList.length;i++)
{
//Get the sub views first
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View openThisFileView = inflater.inflate(R.layout.open_dialog_file, null);
Button openThisFileButton = (Button)openThisFileView.findViewById(R.id.open_this_file_button);
Button appendThisFileButton = (Button)openThisFileView.findViewById(R.id.append_note_this_file);
TextView openThisFileNameTxt = (TextView)openThisFileView.findViewById(R.id.open_this_file_name);
//Set the Text
openThisFileNameTxt.setText(fileNameList[i].getName());
//Set the Listeners
//Add the View
openFileDialogView.addView(openThisFileView);
}
}
//Show the Dialog
openFileDialog.show();
}
}
Как только этот код работает, я получаю следующее сообщение об ошибке, которое NullPointerException
11-18 16:24:20.832: E/AndroidRuntime(1019): FATAL EXCEPTION: main
11-18 16:24:20.832: E/AndroidRuntime(1019): java.lang.NullPointerException
11-18 16:24:20.832: E/AndroidRuntime(1019): at com.x.xxx.VoiceNotes$OpenFileEvent.onClick(VoiceNotes.java:227)
11-18 16:24:20.832: E/AndroidRuntime(1019): at android.view.View.performClick(View.java:4204)
11-18 16:24:20.832: E/AndroidRuntime(1019): at android.view.View$PerformClick.run(View.java:17355)
11-18 16:24:20.832: E/AndroidRuntime(1019): at android.os.Handler.handleCallback(Handler.java:725)
11-18 16:24:20.832: E/AndroidRuntime(1019): at android.os.Handler.dispatchMessage(Handler.java:92)
11-18 16:24:20.832: E/AndroidRuntime(1019): at android.os.Looper.loop(Looper.java:137)
11-18 16:24:20.832: E/AndroidRuntime(1019): at android.app.ActivityThread.main(ActivityThread.java:5041)
11-18 16:24:20.832: E/AndroidRuntime(1019): at java.lang.reflect.Method.invokeNative(Native Method)
11-18 16:24:20.832: E/AndroidRuntime(1019): at java.lang.reflect.Method.invoke(Method.java:511)
11-18 16:24:20.832: E/AndroidRuntime(1019): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-18 16:24:20.832: E/AndroidRuntime(1019): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-18 16:24:20.832: E/AndroidRuntime(1019): at dalvik.system.NativeStart.main(Native Method)
Ошибка нацелена на здесь
openFileDialogView.addView(openThisFileView);
Так как это говорит о том, что LinearLayout
является нулем, вот XML-файл, к которому принадлежит этот макет.
open_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/open_file_dialog"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ffffff">
</LinearLayout>
Это тот же макет, который действует как представление контента для Dialog
,
Почему я так думаю LinearLayout
имеет значение null, а не макет, который был завышен внутри класса? Поскольку приведенный ниже код также сгенерирован NullPointerException
openFileDialogView.addView(new Button(Notes.this));
Почему я получаю эту ошибку?
2 ответа
LinearLayout openFileDialogView = (LinearLayout)findViewById(R.id.open_file_dialog);
Вот findViewById()
пытается найти указанное представление в иерархии представления действия (как установлено setContentView()
но вы раздуваете макет с этим идентификатором только позже. findViewById()
возвращается null
и пытается вызвать метод на null
вызывает NPE.
Попробуйте переместить эту строку
LinearLayout openFileDialogView = (LinearLayout)findViewById(R.id.open_file_dialog);
после
openFileDialog.setContentView(R.layout.open_dialog);
в вашем коде.