【问题标题】:Can't get transparent DialogFragment无法获得透明的 DialogFragment
【发布时间】:2013-12-11 19:47:22
【问题描述】:

我有一个看起来像这样的对话框片段。

AlertDialog ad = builder.create();
Drawable d = new ColorDrawable(Color.BLACK);
d.setAlpha(130);
ad.getWindow().setBackgroundDrawable(d);

此代码使背景半透明。但我仍然在底部有一个白色的部分。我想摆脱白色只有半透明背景

我已经尝试了很多我在其他帖子中看到的东西。

我不知道必须在 DialogFragment、AlertDialog 和 LinearLayout 之间更改的对象是什么。

它可能不是LinearLayout,因为当我增加边距时,什么都没有。

这是我的代码:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
//      setStyle(DialogFragment.STYLE_NORMAL, 0);
//      setStyle(STYLE_NO_FRAME, R.style.CustomDialog);
//      setStyle(STYLE_NO_FRAME, 0);
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    View view = getActivity().getLayoutInflater().inflate(
            R.layout.share_or_die, null);

    AlertDialog ad = builder.create();
    Drawable d = new ColorDrawable(Color.BLACK);
    d.setAlpha(130);
    ad.getWindow().setBackgroundDrawable(d);
    ad.setCanceledOnTouchOutside(true);
    ad.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    ad.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);      

    return ad;

}

当用户单击返回按钮时,我只是在 mainActivity 中调用它:

@Override
public void onBackPressed() {
        if (isUserConnected && !hasShared) {
        shareOnExitDialog = new ShareOnExitDialog();
            shareOnExitDialog.setCancelable(true);
            shareOnExitDialog.show(getSupportFragmentManager(), "Exit");
        } else {
            finish();
        }


}

任何帮助将不胜感激!

【问题讨论】:

  • 你确定 R.layout.share_or_die 中没有白色背景吗?
  • 是的!我里面只有一个linearLayout,但是我改变了linearlayout的属性,白色还是没变。发送求助!
  • 您是否尝试将单个 TextView 而不是 LL 放入对话框中?
  • 另外,你在哪里使用那个膨胀的视图?看起来问题中的代码不完整。
  • 我从不使用我的膨胀视图。当我放置一个文本视图时,它仍然显示为白色:(

标签: android android-dialogfragment


【解决方案1】:

问题出在默认对话框主题中。根据thisthis 的回答,实现目标要容易得多。

Activity 应该如下所示:

public class MyActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
    }

    @Override
    public void onBackPressed() {
        MyDialogFragment.newInstance("title title").show(getSupportFragmentManager(), "dialog");
    }
}

和片段:

public class MyDialogFragment extends android.support.v4.app.DialogFragment {

    /**
     * Create a new instance of MyDialogFragment, providing "title"
     * as an argument.
     */
    static MyDialogFragment newInstance(String title) {
        MyDialogFragment frag = new MyDialogFragment();
        Bundle args = new Bundle();

        args.putString("title", title);
        frag.setArguments(args);
        return frag;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = new Dialog(getActivity(),android.R.style.Theme_Translucent_NoTitleBar);
        final View view = getActivity().getLayoutInflater().inflate(R.layout.share_or_die, null);

        final Drawable d = new ColorDrawable(Color.BLACK);
        d.setAlpha(130);

        dialog.getWindow().setBackgroundDrawable(d);
        dialog.getWindow().setContentView(view);

        final WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
        params.width = WindowManager.LayoutParams.WRAP_CONTENT;
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;
        params.gravity = Gravity.CENTER;

        dialog.setCanceledOnTouchOutside(true);

        return dialog;
    }
}

另外,请务必做到以下几点:在活动中的setContentView() 之前,应添加getWindow().requestFeature(Window.FEATURE_NO_TITLE) 以便使用*NoTitleBar 样式。

结果是(我使用了 LinearLayout 和单个 TextView 内部):

【讨论】:

  • 我得到一个:AndroidRuntimeException: requestFeature() 必须在添加内容之前被调用。而且我从不明确调用 requestFeature()...
  • 仍然是同样的例外:( 提到我使用兼容性 FragmentDialog (v4) 可能很有用
  • 然后你是否 ttri 显示对话框(例如,我试图从 onResume() 显示它)?
  • 当用户单击返回按钮时,我正在显示对话框。我更新了我的代码以显示我的显示方式。
  • 这不起作用,即使我这样做了:requestWindowFeature(Window.FEATURE_NO_TITLE);在活动的 onCreate 上,仍然抛出 requestFeature() 必须调用
【解决方案2】:

希望对你有帮助

@Override
public void onStart() {
    super.onStart();

    Window window = getDialog().getWindow();
    WindowManager.LayoutParams windowParams = window.getAttributes();
    windowParams.dimAmount = 0.0f; 

    window.setAttributes(windowParams);
}

【讨论】:

  • 非常感谢您的回答,它真的很有帮助)这是必须的 - 完全删除背景的步骤
【解决方案3】:

以上解决方案都不适合我。我发现的工作是确保我已经导入了 android.support.v7.app.AlertDialog 而不是通用的 app.alertdialog。

希望这对其他人也有帮助。

【讨论】:

    【解决方案4】:

    它对我有用:

    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    

    【讨论】:

    • 这是我一直在寻找的完美解决方案,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多