Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is (ListView)findViewById returning null?

Help! I've really come to appreciate Stack Overflow and it's contributors over the last few months. Many questions I've had, I've found the answers here... but this one I can't seem to find anywhere... I'm a noob to Java and Android, and I've been trying to figure this out for days. For some reason I have a ListView object called fileList, and it is returning null... Everything compiles fine, but I get a NullPointerException the moment I try to use fileList... I've been able to isolate it to it's declaration:

ListView fileList = (ListView)findViewById(R.id.open_ListView);

But I can't for the life of me understand what is wrong with this line! I've included lots of code below, theoretically it should have any and all code that could be related to this error in any way.

Please, any help on this would be really appreciated! Thanks!


This is the offending section of code. It's just the OPEN_DIALOG part of the switch block, and all the other switches work perfectly fine to display their newDialog's. I've marked the offending line with stars...

@Override
protected Dialog onCreateDialog(int id) 
{
    Dialog newDialog = new Dialog(Minervalia.this);
    switch(id)
    {
    case DIALOG_FILE_NEW:
        newDialog.setContentView(R.layout.new_file);
        newDialog.setTitle("New File");
        newDialog.setCancelable(true);

        Button okBtn = (Button) newDialog.findViewById(R.id.ok_btn);
        Button cancelBtn = (Button) newDialog.findViewById(R.id.cancel_btn);
        final EditText widthEt = (EditText) newDialog.findViewById(R.id.width_edit);
        final EditText heightEt = (EditText) newDialog.findViewById(R.id.height_edit);

        okBtn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                file_width = Integer.parseInt(widthEt.getText().toString());
                file_height = Integer.parseInt(heightEt.getText().toString());
                onCreate(null);
                dismissDialog(DIALOG_FILE_NEW);
            }
        });

        cancelBtn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                dismissDialog(DIALOG_FILE_NEW);
            }
        });
        return newDialog;
    case DIALOG_OPEN:
        newDialog.setContentView(R.layout.open_file);
        newDialog.setTitle("Open File");
        newDialog.setCancelable(true);

// ********** This next line returns null! Why?
        ListView fileList = (ListView)findViewById(R.id.open_ListView);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, loadFileList());
        fileList.setAdapter(adapter);
        fileList.setTextFilterEnabled(true);

        fileList.setOnItemClickListener(new OnItemClickListener() 
        {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
            {
                //  When clicked, show a toast with the TextView text
                Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
            }
        });

        return newDialog;
    case DIALOG_SAVE:
        newDialog.setContentView(R.layout.save_file);
        newDialog.setTitle("Save File");
        newDialog.setCancelable(true);

//--==[[ Define the important TextViews for our Save Dialog ]]==--\\            
        TextView pathTxt = (TextView) newDialog.findViewById(R.id.save_path_info);
        EditText fnTxt = (EditText) newDialog.findViewById(R.id.save_filename_edit);

//--==[[ Define the Radio Buttons for our Save Dialog ]]==--\\          
        RadioButton JPEGoption = (RadioButton) newDialog.findViewById(R.id.save_JPEGoption);
        RadioButton PNGoption = (RadioButton) newDialog.findViewById(R.id.save_PNGoption);

        file_type = TYPE_JPEG; // Set this as the default option

        JPEGoption.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                file_type = TYPE_JPEG;
            }
        });

        PNGoption.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                file_type = TYPE_PNG;
            }
        });

        Button save_okBtn = (Button) newDialog.findViewById(R.id.save_ok_btn);
        Button save_cancelBtn = (Button) newDialog.findViewById(R.id.save_cancel_btn);

        path = pathTxt.getText().toString();

        fnTxt.addTextChangedListener(new TextWatcher() 
        { 
            public void afterTextChanged(Editable s) 
            { 
            } 
            public void beforeTextChanged(CharSequence s, int start, int count, int after) 
            { 
            } 
            public void onTextChanged(CharSequence s, int start, int before, int count) 
            { 
                filename = s.toString(); 
            } 
        }); 
        Toast.makeText(this, path, Toast.LENGTH_SHORT).show();
        Toast.makeText(this, filename, Toast.LENGTH_SHORT).show();
        save_okBtn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                try 
                {
                    String fullName = path + filename;
                    Bitmap.CompressFormat compForm = Bitmap.CompressFormat.JPEG; // make sure our format is initialized
                    if(file_type == TYPE_JPEG) 
                    {
                        fullName = fullName + ".jpg";
                        compForm = Bitmap.CompressFormat.JPEG;
                    }
                    if(file_type == TYPE_PNG)
                    {
                        fullName = fullName + ".png";
                        compForm = Bitmap.CompressFormat.PNG;
                    }
                    File thisImage = new File(fullName);
                    FileOutputStream out = new FileOutputStream(thisImage);
                    mBitmap.compress(compForm, 90, out);

                    new SingleMediaScanner(mContext, thisImage);
                    out.flush();
                    out.close();
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }

                dismissDialog(DIALOG_SAVE);
            }
        });

        save_cancelBtn.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                dismissDialog(DIALOG_SAVE);
            }
        });
        return newDialog;
    }
    return null;
}

private String[] loadFileList()
{
    String[] mFileList = new String[0]; // generate empty array to avoid NullPointerException
    try
    {
        filePath.canWrite();
    }
    catch(SecurityException e)
    {
// Why isn't TAG recognized?...
//           Log.e(TAG, "unable to write on the sd card " + e.toString());
    }
    if(filePath.exists())
    {
        FilenameFilter filter = new FilenameFilter()
        {
            public boolean accept(File dir, String filename)
            {
                File sel = new File(dir, filename);
                return filename.contains(".jpg") || filename.contains(".png") || sel.isDirectory();
            }
        };
        mFileList = filePath.list(filter);
    }
    else
    {
        mFileList = new String[0];
    }
    return mFileList;
}

This is my open_file.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView 
        android:id="@+id/open_ListView" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">
    </ListView>
    <LinearLayout
        android:id="@+id/open_ButtonLinearLayout"
        android:orientation="horizontal" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:gravity="center_horizontal">
        <Button 
            android:id="@+id/open_ok_btn"
            android:text="Open" 
            android:layout_width="150dp" 
            android:layout_height="wrap_content">
        </Button>       
        <Button 
            android:id="@+id/open_cancel_btn" 
            android:text="Cancel"
            android:layout_width="150dp" 
            android:layout_height="wrap_content">
        </Button>       
    </LinearLayout>
</LinearLayout>

And this is my list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textSize="16sp" >
</TextView>
like image 412
W.C. Griffin Avatar asked May 29 '11 13:05

W.C. Griffin


2 Answers

Try this instead, since it's inside the dialog's layout, not the activity's:

ListView fileList = (ListView)newDialog.findViewById(R.id.open_ListView);
like image 51
Geobits Avatar answered Sep 23 '22 14:09

Geobits


Try doing a clean build by navigating to:

'Project' -> 'Clean...' then selecting your project.

like image 24
Glitch Avatar answered Sep 22 '22 14:09

Glitch