在android中的Marshmallow上的文件选择器对话框问题

时间:2016-05-30 05:11:06

标签: android performance android-layout listview android-fragments

我已经尝试打开一个对话框,可以打开文件选择器的对话框,用于创建文件夹,它已经工作正常,在Marshmallow中的kitkat bt它无法显示内部或外部存储卡存储我也设置了运行时权限但是我我无法显示打开的内部存储空间或外部存储卡。有人遇到同样的问题请帮帮我吗?我还在下面粘贴了我的代码。提前致谢

public class DirectoryChooserDialog {

private boolean m_isNewFolderEnabled = true;
private String m_sdcardDirectory = "";
private Context m_context;
private TextView m_titleView;

private String m_dir = "";
private List<String> m_subdirs = null;
private ChosenDirectoryListener m_chosenDirectoryListener = null;
private ArrayAdapter<String> m_listAdapter = null;
private ImageView ivBack;

// ////////////////////////////////////////////////////
// Callback interface for selected directory
// ////////////////////////////////////////////////////
public interface ChosenDirectoryListener {
    public void onChosenDir(String chosenDir);
}

public DirectoryChooserDialog(Context context,
        ChosenDirectoryListener chosenDirectoryListener) {
    m_context = context;
    File test = Environment.getExternalStorageDirectory();
    m_sdcardDirectory = Environment.getExternalStorageDirectory()
            .getAbsolutePath();
    m_chosenDirectoryListener = chosenDirectoryListener;

    try {
        m_sdcardDirectory = new File(m_sdcardDirectory).getCanonicalPath();
    } catch (IOException ioe) {
    }
}

// /////////////////////////////////////////////////////////////////////
// setNewFolderEnabled() - enable/disable new folder button
// /////////////////////////////////////////////////////////////////////

public void setNewFolderEnabled(boolean isNewFolderEnabled) {
    m_isNewFolderEnabled = isNewFolderEnabled;
}

public boolean getNewFolderEnabled() {
    return m_isNewFolderEnabled;
}

// /////////////////////////////////////////////////////////////////////
// chooseDirectory() - load directory chooser dialog for initial
// default sdcard directory


public void chooseDirectory() {
    // Initial directory is sdcard directory
    chooseDirectory(m_sdcardDirectory);
}

// //////////////////////////////////////////////////////////////////////////////
// chooseDirectory(String dir) - load directory chooser dialog for initial
// input 'dir' directory
// //////////////////////////////////////////////////////////////////////////////

public void chooseDirectory(String dir) {
    File dirFile = new File(dir);
    if (!dirFile.exists() || !dirFile.isDirectory()) {
        dir = m_sdcardDirectory;
    }

    try {
        dir = new File(dir).getCanonicalPath();
    } catch (IOException ioe) {
        return;
    }

    m_dir = dir;
    m_subdirs = getDirectories(dir);

    class DirectoryOnClickListener implements
            DialogInterface.OnClickListener {
        public void onClick(DialogInterface dialog, int item) {
            // Navigate into the sub-directory
            m_dir += "/"
                    + ((AlertDialog) dialog).getListView().getAdapter()
                            .getItem(item);
            updateDirectory();
        }
    }

    AlertDialog.Builder dialogBuilder = createDirectoryChooserDialog(dir,
            m_subdirs, new DirectoryOnClickListener());

    dialogBuilder.setPositiveButton("OK", new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // Current directory chosen
            if (m_chosenDirectoryListener != null) {
                // Call registered listener supplied with the chosen
                // directory
                m_chosenDirectoryListener.onChosenDir(m_dir);
            }
        }
    }).setNegativeButton("Cancel", null);

    final AlertDialog dirsDialog = dialogBuilder.create();

    dirsDialog.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(DialogInterface dialog, int keyCode,
                KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK
                    && event.getAction() == KeyEvent.ACTION_DOWN) {
                // Back button pressed
                if (m_dir.equals(m_sdcardDirectory)) {
                    // The very top level directory, do nothing
                    return false;
                } else {
                    // Navigate back to an upper directory
                    m_dir = new File(m_dir).getParent();
                    updateDirectory();
                }

                return true;
            } else {
                return false;
            }
        }
    });

    // Show directory chooser dialog
    dirsDialog.show();
}

private boolean createSubDir(String newDir) {
    File newDirFile = new File(newDir);
    if (!newDirFile.exists()) {
        return newDirFile.mkdir();
    }

    return false;
}

private List<String> getDirectories(String dir) {
    List<String> dirs = new ArrayList<String>();

    try {
        File dirFile = new File(dir);
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return dirs;
        }

        for (File file : dirFile.listFiles()) {
            if (file.isDirectory()) {
                dirs.add(file.getName());
            }
        }
    } catch (Exception e) {
    }

    Collections.sort(dirs, new Comparator<String>() {
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }
    });

    return dirs;
}

private AlertDialog.Builder createDirectoryChooserDialog(String title,
        List<String> listItems,
        DialogInterface.OnClickListener onClickListener) {
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(m_context);
    LayoutInflater inflater = (LayoutInflater) m_context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View convertView = inflater.inflate(
            R.layout.layout_header_filechooser_dialog, null);
    // Create custom view for AlertDialog title containing
    // current directory TextView and possible 'New folder' button.
    // Current directory TextView allows long directory path to be wrapped
    // to multiple lines.
    LinearLayout titleLayout = new LinearLayout(m_context);
    titleLayout.setOrientation(LinearLayout.VERTICAL);

    titleLayout.setBackgroundColor(Color.parseColor("#00ff00"));

    // m_titleView = new TextView(m_context);
    m_titleView = (TextView) convertView
            .findViewById(R.id.tv_title_dialog_file_chooser);
    // m_titleView.setLayoutParams(new
    // LayoutParams(LayoutParams.MATCH_PARENT,
    // LayoutParams.WRAP_CONTENT));
    // m_titleView.setTextAppearance(m_context,
    // android.R.style.TextAppearance_Large);
    // m_titleView.setTextColor(m_context.getResources().getColor(
    // android.R.color.white));
    // m_titleView.setGravity(Gravity.CENTER_VERTICAL
    // | Gravity.CENTER_HORIZONTAL);
    m_titleView.setText(title);

    // Button newDirButton = new Button(m_context);
    Button newDirButton = (Button) convertView
            .findViewById(R.id.btn_create_new_folder_dialog_file_chooser);
    ivBack = (ImageView) convertView
            .findViewById(R.id.iv_back_dialog_file_chooser);
    if (m_dir.equals(m_sdcardDirectory)) {
        ivBack.setVisibility(View.INVISIBLE);
    } else {
        ivBack.setVisibility(View.VISIBLE);
    }
    ivBack.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (m_dir.equals(m_sdcardDirectory)) {
                // The very top level directory, do nothing
            } else {
                // Navigate back to an upper directory
                m_dir = new File(m_dir).getParent();
                updateDirectory();
            }
        }
    });
    // newDirButton.setLayoutParams(new LayoutParams(
    // LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
    // newDirButton.setText("Click For New folder");
    // newDirButton.setTextColor(Color.parseColor("#ffffff"));
    // newDirButton.setBackgroundColor(Color.parseColor("#197319"));
    newDirButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final EditText input = new EditText(m_context);

            // Show new folder name input dialog
            new AlertDialog.Builder(m_context)
                    .setTitle("New folder name")
                    .setView(input)
                    .setPositiveButton("OK",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int whichButton) {
                                    Editable newDir = input.getText();
                                    String newDirName = newDir.toString();
                                    // Create new directory
                                    if (createSubDir(m_dir + "/"
                                            + newDirName)) {
                                        // Navigate into the new directory
                                        m_dir += "/" + newDirName;
                                        updateDirectory();
                                    } else {
                                        Toast.makeText(
                                                m_context,
                                                "Failed to create '"
                                                        + newDirName
                                                        + "' folder",
                                                Toast.LENGTH_SHORT).show();
                                    }
                                }
                            }).setNegativeButton("Cancel", null).show();
        }
    });

    if (!m_isNewFolderEnabled) {
        newDirButton.setVisibility(View.GONE);
    }

    // titleLayout.addView(m_titleView);
    // titleLayout.addView(newDirButton);

    dialogBuilder.setCustomTitle(convertView);

    m_listAdapter = createListAdapter(listItems);

    dialogBuilder.setSingleChoiceItems(m_listAdapter, -1, onClickListener);
    dialogBuilder.setCancelable(false);

    return dialogBuilder;
}

private void updateDirectory() {
    m_subdirs.clear();
    m_subdirs.addAll(getDirectories(m_dir));
    m_titleView.setText(m_dir);
    if (m_dir.equals(m_sdcardDirectory)) {
        ivBack.setVisibility(View.INVISIBLE);
    } else {
        ivBack.setVisibility(View.VISIBLE);
    }
    m_listAdapter.notifyDataSetChanged();
}

private ArrayAdapter<String> createListAdapter(List<String> items) {
    return new ArrayAdapter<String>(m_context,
            android.R.layout.select_dialog_item, android.R.id.text1, items) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = super.getView(position, convertView, parent);

            if (v instanceof TextView) {
                // Enable list item (directory) text wrapping
                TextView tv = (TextView) v;
                tv.getLayoutParams().height = LayoutParams.WRAP_CONTENT;
                tv.setEllipsize(null);
            }
            return v;
        }
    };
  }

}

0 个答案:

没有答案