【问题标题】:Full Screen DialogFragment (over ActionBar) in AndroidAndroid中的全屏DialogFragment(通过ActionBar)
【发布时间】:2014-12-18 23:17:46
【问题描述】:

我在全屏显示 DialogFragment 时遇到了一些问题。在我的应用程序中,我有一个片段,当您单击某个按钮时,它会调用一个 DialogFragment。但是 DialogFragment 只是填充了 Fragment 的区域(在操作栏下方)。我希望它像这样填满整个屏幕:http://img845.imageshack.us/img845/8682/myimage2.png

有什么帮助吗?

     public class ItensActivity extends Fragment {
             ... 
            public void openDialogItens()
            {       
                dialog = new ItemDialog();      
                dialog.show(getFragmentManager(), "");
                getFragmentManager().executePendingTransactions();  

            }

            public static class ItemDialog extends DialogFragment
                {


                   @SuppressWarnings("deprecation")
                   @Override
                   public Dialog onCreateDialog(Bundle savedInstanceState) {
                      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());        
                      builder.setView(getContentView());
                      Dialog dialog = builder.create();
                      dialog.setCanceledOnTouchOutside(true);
                      WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
                      lp.copyFrom(dialog.getWindow().getAttributes());
                      lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
                      lp.height = WindowManager.LayoutParams.FILL_PARENT;
                      dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
                      dialog.getWindow().setAttributes(lp);   
                      return dialog;
                  }

            private View getContentView() {
                   LayoutInflater inflater = getActivity().getLayoutInflater();
                   View view = inflater.inflate(R.layout.popup_item, null);
                   return view;
            }
            }    

【问题讨论】:

  • 我不确定我是否理解你想要的,但如果你想要一个“全屏”片段,为什么要使用 DialogFragment?请改用普通的 Fragment。
  • 这是因为我想像弹出/对话框一样显示它,显示其背面的内容,例如:i.stack.imgur.com/uV5Jd.png。但是 DialogFragment 没有覆盖操作栏
  • 所以...您不想要一个 全屏 Dialog,而是一个部分覆盖 ActionBar 的 Dialog,对吧?
  • 如果对话框被主活动调用,它会起作用。但就片段而言,它没有。

标签: android android-fragments fullscreen android-dialogfragment


【解决方案1】:

所以,经过大量搜索后,我还是没有找到使用 API 5 让 DialogFragment 覆盖操作栏的方法。但我找到了另一种方法来让 Fragment 在屏幕上调用一个新的活动,主题为一个对话框。这个解决方案对我帮助很大,所以,我在这里分享它: https://stackoverflow.com/a/12275009/2327056

@StrikeForceZero 使用谷歌群组帖子中的想法,我能够成功 样式化一个活动。您想将高度和宽度修改为 最好选择您选择的“动态”尺寸。然后随便设置 您想要的 ActionBar 按钮

<style name="PopupTheme" parent="android:Theme.Holo.Light.Dialog">
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowSoftInputMode">stateAlwaysHidden</item>
    <item name="android:windowActionModeOverlay">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

--

public static void showAsPopup(Activity activity) {
    //To show activity as dialog and dim the background, you need to declare android:theme="@style/PopupTheme" on for the chosen activity on the manifest
    activity.requestWindowFeature(Window.FEATURE_ACTION_BAR);
    activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND,
            WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    LayoutParams params = activity.getWindow().getAttributes(); 
    params.height = 850; //fixed height
    params.width = 850; //fixed width
    params.alpha = 1.0f;
    params.dimAmount = 0.5f;
    activity.getWindow().setAttributes((android.view.WindowManager.LayoutParams) params); 
    setContentView(R.layout.activity_main);
}

【讨论】:

  • 把这个放到DialogFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setStyle(STYLE_NO_FRAME, android.R.style.Theme_Wallpaper); }
【解决方案2】:

我找到的最简单的方法

Dialog dialog=new Dialog(this,android.R.style.Theme_Black_NoTitleBar_Fullscreen);
        dialog.setContentView(R.layout.frame_help);
        dialog.show();

【讨论】:

    【解决方案3】:

    您可以在调用#show 时标记对话框片段以使用对话框而不是嵌入片段。

    myDialogFragment.show(getFragmentManager(), "dialog")
    

    这将创建一个对话框,该对话框将覆盖在操作栏和状态栏的顶部(如果您愿意,可以手动重新添加)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      相关资源
      最近更新 更多