4

選択するアイテムのリストを表示するDialogFragmentがあります(Messagingの添付ダイアログに似ています)。

私の問題は、アイテムが選択されたときにこのダイアログを閉じることができないことです。私は電話をかけてみましdismiss()getDialog().dismiss()OnItemClickListener、運が悪かったです。私はFragmentManagerを介してダイアログを削除しようとしましたがfragmentManager.popBackStack()、まったく役に立ちませんでした。このダイアログを閉じることができません。ダイアログの外側をクリックするか、戻るボタンを押すと問題なく消えますが、私のコードには何も消えません。

誰かがこれを見たことがありますか?ダイアログを正しく閉じるにはどうすればよいですか?

ダイアログコード:

public class ShareDialog extends DialogFragment {

public enum ShareType {
    Camera, Gallery, Web, Whiteboard, Browse,
}

BaseAdapter mShareAdapter = new BaseAdapter() {

    @Override
    public View getView(int position, View contentView, ViewGroup parent) {
        TextView view = null;
        if (contentView == null) {
            view = (TextView) getLayoutInflater(null).inflate(android.R.layout.simple_list_item_1, parent, false);
        } else {
            view = (TextView) contentView;
        }
        int draw = 0;
        switch (ShareType.values()[position]) {
        case Browse:
            view.setText("Browse Content...");
            draw = R.drawable.ic_share_browse;
            break;
        case Camera:
            view.setText("Image from Camera...");
            draw = R.drawable.ic_share_camera;
            break;
        case Gallery:
            view.setText("Image from Gallery...");
            draw = R.drawable.ic_share_gallery;
            break;
        case Web:
            view.setText("New Browsing Session");
            draw = R.drawable.ic_share_web;
            break;
        case Whiteboard:
            view.setText("New Whiteboard");
            draw = R.drawable.ic_share_whiteboard;
            break;
        }
        view.setCompoundDrawablesWithIntrinsicBounds(draw, 0, 0, 0);
        view.setCompoundDrawablePadding(8);
        return view;
    }

    @Override
    public long getItemId(int position) {
        return ShareType.values()[position].ordinal();
    }

    @Override
    public Object getItem(int position) {
        return ShareType.values()[position];
    }

    @Override
    public int getCount() {
        return ShareType.values().length;
    }
};

public Dialog onCreateDialog(android.os.Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Share which?");
    ListView list = new ListView(getActivity());
    list.setAdapter(mShareAdapter);
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long itemId) {
            dismiss(); // WHY DOESN'T THIS WORK???
            if (listener != null)
                listener.newShare((ShareType) mShareAdapter.getItem(position));
        }
    });
    builder.setView(list);
    return builder.create();
}

public interface ShareDialogListener {
    void newShare(ShareType type);
}

private ShareDialogListener listener;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the AutoconnectListener so we can send events to the host
        listener = (ShareDialogListener) activity;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(activity.toString() + " must implement ShareDialogListener");
    }
}

}
4

3 に答える 3

3

独自のListViewを作成してデータを入力する代わりに、AlertDialog.Builderで使用可能なメソッドを使用してリストを作成してみませんか?

これがどのように機能するかを示すためにサンプルコードを変更しました。この例では、ダイアログdismiss()は正常に機能します。

public Dialog onCreateDialog(android.os.Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setSingleChoiceItems(mShareAdapter, 0, new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                if (listener != null) {
                    listener.newShare((ShareType) mShareAdapter.getItem(which));
                }
            }
        });
        builder.setTitle("Share which?");
        return builder.create();
    }
于 2013-02-06T21:50:12.967 に答える
2

はぁ……

私はそれを見つけました...

この理由は実際には私たちのものです...私たちはxmlを膨らませようとしていて、呼び出しました:

DialogFragment.this.getLayoutInflater(null).inflate(...);

この呼び出しにより、コメントで述べたように 4 つのダイアログが作成され、すべてが台無しになります。

これを行う適切な方法は、次のように呼び出すことです。

LayoutInflater layoutInflater = (LayoutInflater) getActivity().getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(...);

この修正により、私にとって厄介なバグが最初に解決されました!

于 2013-08-12T12:35:25.203 に答える