【问题标题】:I want to set max height in dialog fragment我想在对话框片段中设置最大高度
【发布时间】:2013-05-28 04:32:51
【问题描述】:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:minWidth="@dimen/dialog_min_width"
    android:padding="@dimen/dialog_padding"
    android:background="@drawable/dialog_background" >

    <TextView android:id="@+id/base_dialog_title"
        style="@style/DialogTitleTextViewStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:gravity="center" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="16dp" >
    </FrameLayout>

<!-- *********************** HERE ************************* -->

    <FrameLayout android:id="@+id/base_dialog_content"
        android:background="@drawable/dialog_description_background"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </FrameLayout>

<!-- *********************** HERE ************************* -->

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="16dp" >
    </FrameLayout>

    <LinearLayout android:id="@+id/base_dialog_button_group"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:orientation="horizontal">

    <Button
        android:id="@+id/base_dialog_button_negative"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:visibility="gone"/>

    <Button
        android:id="@+id/base_dialog_button_neutral"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:visibility="gone"/>

    <Button
        android:id="@+id/base_dialog_button_positive"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:visibility="gone"/>

    </LinearLayout>
</LinearLayout>

这是对话框片段布局。

我将内容视图(TextView 或 ListView)添加到 FrameLayout (@id/base_dialog_content)

当 ListView 有很多 Items 时,Dialog 在窗口中是全高的。

我想设置最大高度对话框或内容视图(或列表视图)


编辑:

我使用 OnLayoutChangeListener 解决了这个问题。

但我在低版本(蜂窝以下)中需要相同的功能

在DialogFragment.onCreateView()中

FrameLayout contentContainer = (FrameLayout) view.findViewById(R.id.base_dialog_content);       
final View contentView = createContentView(inflater, contentContainer);
contentContainer.addView(contentView);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // TODO Check content view height and change height
} else {
    view.addOnLayoutChangeListener(new 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 = contentView.getHeight();
            int winHeight = ActivityUtil.getDisplayHeight(getSherlockActivity());

            LogUtils.pe(height+" / "+winHeight+" / "+contentHeight);

            int needHeight = height - winHeight*8/10;
            if (needHeight > 0) {
                contentView.setLayoutParams(
                        new LayoutParams(LayoutParams.MATCH_PARENT, contentHeight-needHeight));
            }
        }
    });
}

【问题讨论】:

  • 你想要的最大高度是多少?是在dp中定义的还是基于屏幕大小?
  • @NAYOSO“基于屏幕尺寸”更好。但是“dp 中的恒定值”对我也有好处。
  • 请看我的回答:)

标签: android android-layout android-linearlayout


【解决方案1】:

要控制最大高度,您必须首先将内容视图放在一个布局容器中(线性/相对),假设在我的示例中,我将使用线性布局

测量屏幕高度(我把它放在 Util.java 中):

public static int getDisplayHeight(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay(); 
        int height = display.getHeight(); 

        return height;
    }

之后你创建一个容器:

LinearLayout llContainerContent = new LinearLayout(context);
LayoutParams lpContainerContent = new LayoutParams(LayoutParams.FILL_PARENT, (Util.getDisplayHeight(context) * 8) /10);
llContainerContent.setLayoutParams(lpContainerContent);

之后将 textview/listview 添加到容器中,然后将容器添加到框架布局中。我希望我的回答对您来说足够清楚,但是如果您还有其他问题,请随时在评论中提问:)

【讨论】:

  • 谢谢。但不是设置最大高度。我想设置最大高度而不仅仅是高度......它无法检查内容视图高度是否大于最大高度。
  • 啊对不起,我误会你的意思了,请稍等,我稍后再改代码
  • @ChangUZ 但我认为使用我的代码视图不会再次填满屏幕,或者您是否要测量所有子高度并阻止程序在总高度时添加更多视图的孩子比父母多?
【解决方案2】:

将此代码用于对话框的全屏高度和宽度

    WindowManager window = (WindowManager)context

    .getSystemService(Context.WINDOW_SERVICE);

    Display display = window.getDefaultDisplay();

    displayheight = display.getHeight();

    displaywidth = display.getWidth();
    dialog.getWindow().setLayout(displaywidth ,
                displayheight );

【讨论】:

    【解决方案3】:

    如何使用onResume 来完成它:

    override fun onResume() {
        super.onResume()
        val width = (resources.displayMetrics.widthPixels * 0.95).toInt()
        val height = (resources.displayMetrics.heightPixels * 0.60).toInt()
        dialog?.window?.setLayout(width, height)
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-31
      • 2012-06-26
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2020-12-23
      相关资源
      最近更新 更多