2014-11-15 7 views
0

Я скопировал класс, который открывает диалоговое окно, чтобы выбрать файл, из учебника, и я не знаю, почему он выбрасывает мне это исключение, может кто угодно Помоги мне?Невозможно запустить Activity ComponentInfo java.lang.NullPointerException File Browser

Это класс:

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.os.Environment; 
import android.util.Log; 

import java.io.File; 
import java.io.FilenameFilter; 
import java.util.ArrayList; 
import java.util.List; 

public class FileDialog { 
    private static final String PARENT_DIR = ".."; 
    private final String TAG = getClass().getName(); 
    private String[] fileList; 
    private File currentPath; 
    public interface FileSelectedListener { 
     void fileSelected(File file); 
    } 
    public interface DirectorySelectedListener { 
     void directorySelected(File directory); 
    } 
    private ListenerList<FileSelectedListener> fileListenerList = new ListenerList<FileDialog.FileSelectedListener>(); 
    private ListenerList<DirectorySelectedListener> dirListenerList = new ListenerList<FileDialog.DirectorySelectedListener>(); 
    private final Activity activity; 
    private boolean selectDirectoryOption; 
    private String fileEndsWith; 

    public FileDialog(Activity activity, File path) { 
     this.activity = activity; 
     if (!path.exists()) path = Environment.getExternalStorageDirectory(); 
     loadFileList(path); 
    } 

    public Dialog createFileDialog() { 
     Dialog dialog = null; 
     AlertDialog.Builder builder = new AlertDialog.Builder(activity); 

     builder.setTitle(currentPath.getPath()); 
     if (selectDirectoryOption) { 
      builder.setPositiveButton("Select directory", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        Log.d(TAG, currentPath.getPath()); 
        fireDirectorySelectedEvent(currentPath); 
       } 
      }); 
     } 

     builder.setItems(fileList, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       String fileChosen = fileList[which]; 
       File chosenFile = getChosenFile(fileChosen); 
       if (chosenFile.isDirectory()) { 
        loadFileList(chosenFile); 
        dialog.cancel(); 
        dialog.dismiss(); 
        showDialog(); 
       } else fireFileSelectedEvent(chosenFile); 
      } 
     }); 

     dialog = builder.show(); 
     return dialog; 
    } 


    public void addFileListener(FileSelectedListener listener) { 
     fileListenerList.add(listener); 
    } 

    public void removeFileListener(FileSelectedListener listener) { 
     fileListenerList.remove(listener); 
    } 

    public void setSelectDirectoryOption(boolean selectDirectoryOption) { 
     this.selectDirectoryOption = selectDirectoryOption; 
    } 

    public void addDirectoryListener(DirectorySelectedListener listener) { 
     dirListenerList.add(listener); 
    } 

    public void removeDirectoryListener(DirectorySelectedListener listener) { 
     dirListenerList.remove(listener); 
    } 

    /** 
    * Show file dialog 
    */ 
    public void showDialog() { 
     createFileDialog().show(); 
    } 

    private void fireFileSelectedEvent(final File file) { 
     fileListenerList.fireEvent(new ListenerList.FireHandler<FileSelectedListener>() { 
      public void fireEvent(FileSelectedListener listener) { 
       listener.fileSelected(file); 
      } 
     }); 
    } 

    private void fireDirectorySelectedEvent(final File directory) { 
     dirListenerList.fireEvent(new ListenerList.FireHandler<DirectorySelectedListener>() { 
      public void fireEvent(DirectorySelectedListener listener) { 
       listener.directorySelected(directory); 
      } 
     }); 
    } 

    private void loadFileList(File path) { 
     this.currentPath = path; 
     List<String> r = new ArrayList<String>(); 
     if (path.exists()) { 
      if (path.getParentFile() != null) r.add(PARENT_DIR); 
      FilenameFilter filter = new FilenameFilter() { 
       public boolean accept(File dir, String filename) { 
        File sel = new File(dir, filename); 
        if (!sel.canRead()) return false; 
        if (selectDirectoryOption) return sel.isDirectory(); 
        else { 
         boolean endsWith = fileEndsWith != null ? filename.toLowerCase().endsWith(fileEndsWith) : true; 
         return endsWith || sel.isDirectory(); 
        } 
       } 
      }; 
      String[] fileList1 = path.list(filter); 
      for (String file : fileList1) { 
       r.add(file); 
      } 
     } 
     fileList = (String[]) r.toArray(new String[]{}); 
    } 

    private File getChosenFile(String fileChosen) { 
     if (fileChosen.equals(PARENT_DIR)) return currentPath.getParentFile(); 
     else return new File(currentPath, fileChosen); 
    } 

    public void setFileEndsWith(String fileEndsWith) { 
     this.fileEndsWith = fileEndsWith != null ? fileEndsWith.toLowerCase() : fileEndsWith; 
    } 
} 

class ListenerList<L> { 
    private List<L> listenerList = new ArrayList<L>(); 

    public interface FireHandler<L> { 
     void fireEvent(L listener); 
    } 

    public void add(L listener) { 
     listenerList.add(listener); 
    } 

    public void fireEvent(FireHandler<L> fireHandler) { 
     List<L> copy = new ArrayList<L>(listenerList); 
     for (L l : copy) { 
      fireHandler.fireEvent(l); 
     } 
    } 

    public void remove(L listener) { 
     listenerList.remove(listener); 
    } 

    public List<L> getListenerList() { 
     return listenerList; 
    } 
} 

Это где я называю это в моей деятельности:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    File mPath = new File(Environment.getExternalStorageDirectory()+ "//DIR//"); 
    fileDialog = new FileDialog(this, mPath); 
    fileDialog.setFileEndsWith(".txt"); 
    fileDialog.addFileListener(new FileDialog.FileSelectedListener() { 
     public void fileSelected(File file) { 
      Log.d(getClass().getName(), "selected file " + file.toString()); 
     } 
    }); 
    fileDialog.showDialog(); 
} 

И, наконец, мой трассировки стека:

java.lang.RuntimeException: Unable to start activity ComponentInfo{MainActivity}                            java.lang.NullPointerException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2200) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250) 
     at android.app.ActivityThread.access$800(ActivityThread.java:139) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1200) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5105) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
     at rpstudios.com.FileDialog.loadFileList(FileDialog.java:130) 
     at rpstudios.com.FileDialog.<init>(FileDialog.java:35) 
     at rpstudios.com.MainActivity.onCreate(MainActivity.java:22) 

Любое предложение приветствуется

EDIT: Исключение NullPointerException находится в строке 130: for(String file : fileList1) в методе loadFileList().

ответ

0

я думаю, что в общественном диалоге createFileDialog() вам не хватает создать()

dialog = builder.show(); 

Должно быть

dialog = builder.create().show(); 

Давайте попробуем;)

+0

не работает ли ... –