2011-05-29 11 views
5

¡Ayuda! Realmente he llegado a apreciar Stack Overflow y sus colaboradores en los últimos meses. Muchas de las preguntas que he tenido, he encontrado las respuestas aquí ... pero esta parece que no puedo encontrar en ninguna parte ... Soy un novato en Java y Android, y he estado tratando de resolver esto fuera por días. Por alguna razón, tengo un objeto ListView llamado fileList, y está devolviendo null ... Todo compila bien, pero obtengo una NullPointerException en el momento que trato de usar FileList ... He podido aislarlo de su declaración:¿Por qué (ListView) findViewById devuelve nulo?

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

Pero no puedo entender lo que está mal con esta línea! He incluido muchos códigos a continuación, teóricamente debería tener cualquier código que pudiera estar relacionado con este error de alguna manera.

Por favor, cualquier ayuda en esto sería muy apreciada! ¡Gracias!


Esta es la sección ofensiva del código. Es solo la parte OPEN_DIALOG del bloque de conmutadores, y todos los otros conmutadores funcionan perfectamente bien para mostrar sus nuevos Diálogos. He marcado la línea en cuestión con las estrellas ...

@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; 
} 

Esta es mi 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> 

y este es mi 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> 

Respuesta

8

probar este lugar, ya que hay dentro de la disposición del diálogo, no el de la actividad:

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

¡YAY! ¡Eso funciono! Muchas gracias! ... Y después de que publicaste esto, y lo probé, me di cuenta de que había estado haciendo eso todo el tiempo para todo lo demás ... y nunca lo había notado ... ¡duh! ¡Gracias, gracias, gracias! –

4

trate de hacer una compilación limpia navegando a:

'Proyecto' -> 'Limpiar ...' y luego seleccionando su proyecto.

+0

Por extraño que parezca, este me funcionó. – mahdaeng

+0

Funcionó para mí también. Gracias Glitch! – conciliator

2

Usted debe escribir setcontenetview encima de su ..sorry code..before ListView fileList = (ListView)findViewById(R.id.open_ListView); por mi Inglés ....!

Cuestiones relacionadas