Cannot get DialogFragment for software rejection

I have a DialogFragment that shows a list of items to select (similar to the dialog application in Messaging).

My problem is that I cannot turn off this dialog when an item is selected. I tried calling dismiss() and getDialog().dismiss() inside OnItemClickListener , no luck. I tried to delete the dialog via FragmentManager, I tried fragmentManager.popBackStack() , all to no avail. I can not turn off this dialog. It goes well when you click outside the dialog box or click the back button, but nothing in my code will make it go away.

Has anyone seen this before? How can I cancel the dialog correctly?

Dialog Code:

 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
source share
3 answers

For some - unknown to me - the reason, the link to the dialog that you return from getDialog (), is not the one you want to work with when inside the listener. You need a link to the dialog box that is provided to you when calling builder.create ();

For instance:

  final AlertDialog dialog = builder.create(); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { dialog.dismiss(); } }); return dialog; 
+2
source

Why not use the methods available in AlertDialog.Builder to create a list instead of creating your own ListView and populating it?

I modified your sample code to show how this will work, and in this example the dialogoff () function works fine.

 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(); } 
+3
source

HA ....

I found him...

The reason for this is ours ... we tried to inflate xml and called:

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

This call causes, as I said in the commentary, to create 4 dialogs, and then everything gets messed up.

The correct way to do this is to call:

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

This fix fixes an annoying bug for me the first time!

+2
source

All Articles