2017-04-06 83 views
3

我想设置对话框的最大高度。不是由dp或px设置的自定义高度。我想设置最大可能的高度来对比当前设备的屏幕尺寸。如何将最大高度设置为对话框?

+0

像高度:100%? – DevMoutarde

+0

如果你希望它被修复,那么你应该设置一个dp,因为它是基于屏幕的物理尺寸。 –

回答

2

您不能直接设置最大高度。只是一个替代品,如果其高度大于要设置的最大高度,则可以重置高度。

WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); 
lp.copyFrom(dialog.getWindow().getAttributes()); 
int dialogWidth = lp.width; 
int dialogHeight = lp.height; 

if(dialogHeight > MAX_HEIGHT) { 
    d.getWindow().setLayout(width,MAX_HEIGHT); 
} 
1
DisplayMetrics displaymetrics = new DisplayMetrics(); 

getActivity().getWindowManager().getDefaultDisplay() 
.getMetrics(displaymetrics); 
int width = (int) (displaymetrics.widthPixels); 
int height = (int) (displaymetrics.heightPixels); 
d.getWindow().setLayout(width,height); 
d.show(); 

其中d是对话。此代码将对话框设置为全屏。

+0

Noooo。默认对话框的最大高度。使对话框高度不等于屏幕高度,但使其成为默认对话框高度的最大值 –

+0

默认对话框高度取决于您为其输入的文本。你的要求是什么? – EagleEye

+0

而我想要设置对话框的固定高度 –

3
Dialog dialog = new Dialog(context); 
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
dialog.setContentView(R.layout.dialog_example); 
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); 
lp.copyFrom(dialog.getWindow().getAttributes()); 
lp.width = WindowManager.LayoutParams.WRAP_CONTENT; 
lp.height = WindowManager.LayoutParams.MATCH_PARENT; 
//lp.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 330/*height value*/, getResources().getDisplayMetrics()); for custom height value 
dialog.getWindow().setAttributes(lp); 
dialog.show(); 

我认为这可以解决它。我已经添加了两种方法,一种是为匹配父级属性设置对话框高度,另一种是为自定义值设置高度

1

可能是addOnLayoutChangeListener()对你有用。

可以dialog.show之前或之后添加它()

这是我的代码:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    final View view = LayoutInflater.from(this).inflate(R.layout.custom_alertdialog, null); 
    builder.setMessage("TestMessage xxxxxxx"); 
    builder.setPositiveButton("ok", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
     } 
    }); 

    builder.setView(view); //在setView之前调用builder的原有设置控件方法时,能展示设置的控件,之后设置的则不展示!! 
    AlertDialog dialog = builder.create(); 
    dialog.getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.shape_bk_cnoneralert)); 
    //builder.show(); //用这个的话,背景并不会改变,依旧是默认的 

    dialog.show(); //必须用这个show 才能显示自定义的dialog window 的背景 

    //这种设置宽高的方式也是好使的!!!-- show 前调用,show 后调用都可以!!! 
    view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
     @Override 
     public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, 
            int oldRight, int oldBottom) { 
      int height = v.getHeight(); 
      int contentHeight = view.getHeight(); 

      LogUtils.e("高度", height + "/" + "/" + contentHeight); 
      int needHeight = 500; 

      if (contentHeight > needHeight) { 
       //注意:这里的 LayoutParams 必须是 FrameLayout的!! 
       //NOTICE : must be FrameLayout.LayoutParams 
       view.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, 
         needHeight)); 
      } 
     } 
    }); 
相关问题