1. ホーム
  2. android

カスタムダイアログに余白を設定するには?

2023-08-03 10:49:22

質問

カスタムダイアログにマージンを設定する方法をご存知の方はいらっしゃいますか?カスタムダイアログがあるのですが、レイアウトパラメータで明示的にWRAP_CONTENTを設定したにもかかわらず、表示されると親画面いっぱいに広がってしまうので質問させていただきました。

基本的に、ダイアログはリストビューを含み、その要素は下にスクロールされなければなりませんが、要素が例えば1であるとき、それは伸びませんが、より多くのアイテムが追加されたとき、ダイアログは画面全体を占めます。

何か提案はありますか? 私は、満足のいく結果を得ることなく、可能なソリューションのすべての可能な組み合わせを試してきました。

EDIT: ダイアログのレイアウトを追加しました。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="50dip"   
    android:orientation="vertical"
    android:layout_gravity="top|center">

    <FrameLayout android:layout_width="fill_parent" android:layout_margin="5dip" android:layout_height="wrap_content">

            <TextView android:layout_width="wrap_content"        android:layout_height="wrap_content" 
                android:layout_gravity="center"
                android:textSize="20sp" android:textColor="@color/black"/>

            <Button android:layout_height="32dip" android:layout_width="32dip" 
                android:id="@+id/guide_dialog_cross_button"
                android:background="@drawable/button_cross_white"/>

        </FrameLayout>


    <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" 
        android:fadingEdge="none"
        android:layout_margin="5dip"/>

    <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_margin="5dip" />

</LinearLayout>

どのように解決するのですか?

マージンはダイアログでは機能しません。トップレベルのウィンドウビューはマージンをサポートするレイアウトタイプではないと想像しています。マージンは、(トップレベルのビュー要素ではなく)ダイアログのスタイルとして定義されたときに機能するという投稿を見たことがありますが、これも機能しないようです。

この問題を回避するために必要なのは inset drawable をダイアログの背景に使用し、背景の余分な挿入を考慮したパディングを調整することです。以下の例では、左と右の余白を設定します。

ダイアログの背景の drawable です。

<?xml version="1.0" encoding="utf-8"?>
<!-- drawable is a reference to your 'real' dialog background -->
<!-- insetRight and insetLeft add the margins -->
<inset
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/dialog_background" 
    android:insetRight="10dp"
    android:insetLeft="10dp">
</inset>

ダイアログのメインビューです。

<?xml version="1.0" encoding="utf-8"?>
<!-- paddingTop / paddingBottom padding for the dialog -->
<!-- paddingLeft / paddingRight padding must add the additional inset space to be consistent -->
<!-- background references the inset background drawable -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:paddingLeft="15dp"
    android:paddingRight="15dp"
    android:background="@drawable/dialog_background_inset">

<!-- ...the rest of the layout... -->

また、ダイアログ自体の背景色を透明に設定する必要があるかもしれません。このようにカラーリソースを追加します。

<color name="transparent">#00000000</color>

そして、ダイアログのウィンドウの背景色を次のように設定します(注意:色を直接指定するとeclipseから文句を言われます)。

<style name="Dialog" parent="android:style/Theme.Dialog">
    <item name="android:windowBackground">@color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
</style>

このスタイルは、ダイアログのコンストラクタで theme 引数として渡さなければなりません。 new Dialog(context, R.style.Dialog);