2013-02-06 23 views
4

我有一个DialogFragment,它显示了要从中选择的项目列表(类似于Messaging中的附加对话框)。无法获得DialogFragment以编程方式解除

我的问题是,我不能让这个对话框关闭,当一个项目被选中。我试过拨打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"); 
    } 
} 

} 
+0

我注意到onDialogCreated方法被调用了4次,并且在每次创建对话框的新实例时...在onItemClickListener中,getDialog返回的对话框是最后一个,并调用dismiss或cancel on它什么都没有! – TacB0sS

回答

2

对于一些 - 未知的我 - 的原因,对话参考你getDialog回来()是不是你想要的监听器里的时候一起工作的人。您需要在调用builder.create()时提供的对话框的引用。

例如:

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; 
3

为什么不使用上AlertDialog.Builder可用的方法来构建,而不是创建自己的ListView和填充它的列表中,?

我已经修改了你的示例代码,以显示这将如何工作,在这个例子中,对话框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(); 
    } 
+0

谢谢!我不相信我错过了这个选择。有趣的是(因为我试过了)'DialogFragment.dismiss()'是不够的,我必须在DialogInterface上调用它。不知道为什么。或者为什么ListView导致这样的问题。 – Brandon

2

HA ....

,我找到了......

这样做的原因其实是我们的......我们试图夸大一个XML,并呼吁:

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

这个调用导致,就像我在评论中指出创建4个对话框,然后事情变得混乱起来。

正确的方式做,这将是拨打:

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

此修复程序解决了恼人的错误,我就先走!

+0

你可以在这里阅读:http://android-know-how-to.blogspot.co.il/2013/08/multi-language-android-application.html – TacB0sS

相关问题