Android 为什么AlertDialog在show()上崩溃?

Android 为什么AlertDialog在show()上崩溃?,android,Android,我是AlertDialogs新手,无法让它与游标一起工作。下面的代码在onCreate()函数中,我知道游标中有行。我是否缺少创建代码的一部分 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); // set title alertDialogBuilder.setTitle("Choose a playlist"); // set dialog message alertDialogBuilder.

我是AlertDialogs新手,无法让它与游标一起工作。下面的代码在onCreate()函数中,我知道游标中有行。我是否缺少创建代码的一部分

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

// set title
alertDialogBuilder.setTitle("Choose a playlist");

// set dialog message
alertDialogBuilder.setCancelable(false);

// Add cursor items
alertDialogBuilder.setCursor(cursor, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int pos) {
        Toast.makeText(getApplicationContext(), "Clicked on: " + pos, Toast.LENGTH_SHORT).show();
    }
}, MediaStore.Audio.Media.DISPLAY_NAME);

// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();

// show it
alertDialog.show();
光标生成器:

private Cursor getPlaylists() {
    String[] ARG_STRING = {
            MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.DATA,
            MediaStore.Audio.Media.DISPLAY_NAME,
            MediaStore.Audio.Media.IS_MUSIC
    };
    Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                                               ARG_STRING,
                                               null,
                                               null,
                                               null);

    int nameColumn = cursor.getColumnIndex(MediaStore.Audio.Media.IS_NOTIFICATION);
    cursor.moveToFirst();
    for (int i=0; i<5; i++)
        Toast.makeText(getApplicationContext(), "" + cursor.getString(nameColumn), Toast.LENGTH_SHORT).show();
    return cursor;
}
private Cursor getPlaylists(){
字符串[]ARG\u字符串={
MediaStore.Audio.Media.\u ID,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY\u名称,
MediaStore.Audio.Media.IS_MUSIC
};
Cursor Cursor=getContentResolver().query(MediaStore.Audio.Media.EXTERNAL\u CONTENT\u URI,
ARG_字符串,
无效的
无效的
无效);
int nameColumn=cursor.getColumnIndex(MediaStore.Audio.Media.IS_通知);
cursor.moveToFirst();

对于(inti=0;i您是对的。我的意思是代码如下所示:

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

// set title
alertDialogBuilder.setTitle("Choose a playlist");

// set dialog message
alertDialogBuilder.setCancelable(false);

// Add cursor items
alertDialogBuilder.setCursor(cursor, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int pos) {
        Toast.makeText(getApplicationContext(), "Clicked on: " + pos, Toast.LENGTH_SHORT).show();
    }
}, MediaStore.Audio.Media.DISPLAY_NAME);


// show it
alertDialogBuilder.show();

这应该可以。如果没有,你能显示你的logcat吗?

在游标生成器中,你试图获取一个你没有查询的列的索引

int nameColumn = cursor.getColumnIndex(MediaStore.Audio.Media.IS_NOTIFICATION);
您的查询需要四列,其中不包括您试图访问的MediaStore.Audio.Media.IS_通知:

String[] ARG_STRING = {
        MediaStore.Audio.Media._ID,
        MediaStore.Audio.Media.DATA,
        MediaStore.Audio.Media.DISPLAY_NAME,
        MediaStore.Audio.Media.IS_MUSIC
};

要解决此问题,只需将MediaStore.Audio.Media.IS_通知添加到ARG_字符串。

结果显示以数字开头的字符串会将其打断。更改

MediaStore.Audio.Media.DISPLAY_NAME


修复它。

删除该行将导致
alertDialog
为空,在下一行抛出一个NPE。如果您说“将该调用替换为对
alertDialogBuilder.show()的调用,因为这将创建并显示它”,您可能有一个很好的答案,但您可能还想解释一下。将最后几行更改为
alertDialogBuilder.show()
会导致相同的错误。嗯…说无法从一个有241行,4列的游标窗口中读取第0行,第1列。K,更新:将MediaStore.Audio.Media.DISPLAY\u NAME更改为MediaStore.Audio.Media.\u ID似乎可以工作,但我需要名称…那么…什么错误?请输入Logcat。抱歉,这只是为了测试内容。我实际上没有使用它帽子
"" + MediaStore.Audio.Media.DISPLAY_NAME