Android 为什么AlertDialog在show()上崩溃?
我是AlertDialogs新手,无法让它与游标一起工作。下面的代码在onCreate()函数中,我知道游标中有行。我是否缺少创建代码的一部分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.
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