列表对话框片段 - 无法找到资源

时间:2012-11-12 17:30:54

标签: android android-layout android-widget

我有一个内部类来创建和显示一个简单的列表对话框。

private static class DisplayListDialogFragment extends DialogFragment 
{
    List<String> list;
    OnClickListener clickListener;

    private static DisplayListDialogFragment newInstance(List<String> list, String title, OnClickListener clickListener)
    {
        DisplayListDialogFragment dldf = new DisplayListDialogFragment();
        dldf.list = (List<String>)list;
        dldf.clickListener = clickListener;
        Bundle bundle = new Bundle();
        bundle.putString("title", title);
        dldf.setArguments(bundle);
        return dldf;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        ArrayAdapter<String> ad = new ArrayAdapter<String>(getActivity(), R.id.simpleListItem, this.list);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string._select_display)
               .setSingleChoiceItems(ad, 1, this.clickListener);
        return builder.create();
    }
}

引用的资源在字符串文件

中声明
    <string name="_select_display">Select Display</string>

和一个名为simple_list.xml的小文件

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/simpleListItem"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:textAppearance="?android:attr/textAppearanceMedium"
/>

该应用程序在该行

的资源不足深处某处爆炸
return builder.create();

堆栈跟踪

11-12 17:21:01.664: E/AndroidRuntime(1335): android.content.res.Resources$NotFoundException: Resource ID #0x7f040052 type #0x12 is not valid
11-12 17:21:01.664: E/AndroidRuntime(1335):     at android.content.res.Resources.loadXmlResourceParser(Resources.java:1874)
11-12 17:21:01.664: E/AndroidRuntime(1335):     at android.content.res.Resources.getLayout(Resources.java:731)
11-12 17:21:01.664: E/AndroidRuntime(1335):     at android.view.LayoutInflater.inflate(LayoutInflater.java:318)
11-12 17:21:01.664: E/AndroidRuntime(1335):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:332)
11-12 17:21:01.664: E/AndroidRuntime(1335):     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)

资源ID在R.java中定义为

        public static final int simpleListItem=0x7f040052

(即上面的simple_list.xml文件中声明的TextView)

有人能看出什么问题吗?我此刻正在挠头。

由于

安德鲁

2 个答案:

答案 0 :(得分:3)

查看您正在调用的特定ArrayAdapter构造函数的文档:

public ArrayAdapter (Context context, int textViewResourceId, List<T> objects)

特别是,它解释了第二个参数参数:

  

textViewResourceId - 包含要在实例化视图时使用的TextView的布局文件的资源ID。

换句话说,您当前正在传递错误的ID类型(这也是LogCat错误所说的)。您应该提供布局文件的ID,而不是在布局文件中提供TextView ID。想一想:如果您没有提及布局,Android会如何知道从TextView充气的位置?

ArrayAdapter更改为:

ArrayAdapter<String> ad = new ArrayAdapter<String>(getActivity(), R.layout.simple_list, this.list);

或者,传递布局 TextView ID:

ArrayAdapter<String> ad = new ArrayAdapter<String>(getActivity(), R.layout.simple_list, R.id.simpleListItem, this.list);

PS:我同意文档可能会引起一些混淆,因为textViewResourceId参数的含义因各种构造函数而异。

答案 1 :(得分:0)

简单代码:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Title");
       .setItems(R.array.colors_array, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int which) {
           // The 'which' argument contains the index position
           // of the selected item
       }
});
return builder.create().show;