简体   繁体   English

为什么 (ListView)findViewById 返回 null?

[英]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.在过去的几个月里,我真的很欣赏 Stack Overflow 和它的贡献者,我有很多问题。 I've found the answers here... but this one I can't seem to find anywhere.., I'm a noob to Java and Android.我在这里找到了答案……但是我似乎在任何地方都找不到答案……,我是 Java 和 Android 的菜鸟。 and I've been trying to figure this out for days, For some reason I have a ListView object called fileList.几天来我一直试图解决这个问题,出于某种原因,我有一个名为 fileList 的 ListView object。 and it is returning null.., Everything compiles fine.它返回 null ..,一切编译正常。 but I get a NullPointerException the moment I try to use fileList..: I've been able to isolate it to it's declaration:但是当我尝试使用 fileList 时我得到一个 NullPointerException ..:我已经能够将它隔离到它的声明中:

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.它只是开关块的 OPEN_DIALOG 部分,所有其他开关都可以很好地显示它们的 newDialog。 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:这是我的 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:这是我的 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>

Try this instead, since it's inside the dialog's layout, not the activity's:试试这个,因为它在对话框的布局中,而不是在活动的:

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

Try doing a clean build by navigating to:尝试通过导航到以下位置进行干净构建:

'Project' -> 'Clean...' then selecting your project. 'Project' -> 'Clean...' 然后选择你的项目。

You should put setcontenetview on top of your findViewById .您应该将setcontenetview放在您的findViewById之上。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM