1

単純なリストダイアログを作成して表示するための内部クラスがあります。

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)

誰かが何が悪いのかわかりますか?今、頭をかいてます。

ありがとう

アンドリュー

4

2 に答える 2

3

ArrayAdapter呼び出している特定のコンストラクターのドキュメントを参照してください。

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

特に、2番目のパラメーターパラメーターについて説明します。

textViewResourceId-ビューをインスタンス化するときに使用するTextViewを含むレイアウトファイルのリソースID 。

言い換えると、現在、間違ったIDタイプを渡しています(これはLogCatエラーも示しています)。レイアウトファイル内にIDを指定するのではなくTextView、レイアウトファイルのIDを指定する必要があります。TextView考えてみてください。レイアウトについて言及しない場合、Androidはどのようにしてどこから膨らませるかを知ることができますか?

作成を次のように変更ArrayAdapterします。

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

または、レイアウトと TextViewIDの両方を渡します。

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

textViewResourceIdPS:パラメーターの意味はさまざまなコンストラクターによって異なるため、ドキュメントによって混乱が生じる可能性があることに同意します。

于 2012-11-12T18:32:11.617 に答える
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;
于 2013-10-03T13:58:03.523 に答える