Android:タイトルなしでダイアログを作成する方法は?


269

Androidでカスタムダイアログを生成しようとしています。私はこのようにダイアログを作成します:

dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);

ダイアログのタイトル以外はすべて正常に動作します。ダイアログのタイトルを設定しなくても、ダイアログポップアップのダイアログの位置に空白が表示されます。

ダイアログのこの部分を非表示にする方法はありますか?

AlertDialogで試しましたが、レイアウトが正しく設定されていないようです。

LayoutInflater inflater = 
    (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.map_dialog, null);

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);

// dialog = new Dialog(this);
// dialog.setContentView(R.layout.map_dialog);

dialog = builder.create();

((TextView) dialog.findViewById(R.id.nr)).setText(number);

このコードを使用すると、最後の行にnullポインター例外が表示されます。ダイアログはnullではないため、取得しようとしたTextViewは存在しません。
ダイアログコンストラクターを使用している部分のコメントを外すと、ダイアログレイアウトの上のタイトルを除いてすべて正常に動作します。



以前の答えの代わりにstackoverflow.com/questions/6263639/…を試してください...簡単な答え
Mohammed mansoor

AlertDialog.Builder.setTitle()を呼び出さないでください。ダイアログがタイトルなしで表示されます。
マーバトロン

回答:


208

以下を使用して、ダイアログのタイトルを非表示にすることができます。

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


この回答の以前のバージョンは複雑すぎます。

を使用する必要がありますAlertDialogカスタムダイアログについては、Androidデベロッパーサイトに説明があります

簡単に言うと、公式ウェブサイトから下にコピーしたようなコードでこれを行います。これはカスタムlayotファイルを受け取り、それを膨らませ、いくつかの基本的なテキストとアイコンを与え、それを作成します。次に、で表示しalertDialog.show()ます。

AlertDialog.Builder builder;
AlertDialog alertDialog;

Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater)
        mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
        (ViewGroup) findViewById(R.id.layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);

builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();

コメントへの応答:

IDのTextView nrは、インフレートしているビューにあると思いますView view = inflater....。もしそうなら、あなたはただ1つのビットを変更する必要があります。代わりにdialog.findView...メイクことview.findView...。その後、それを行ったら、builder.create()を実行することなく、dialog.show()またはbuilder.show()を使用することを忘れないでください。


4
質問を読み間違えたと思いますか?Januszにはすでにカスタムダイアログが表示されており、タイトルの削除に関する情報が必要なだけです
Donal Rafferty 2010

17
公式ドキュメントによると、「基本Dialogクラスで作成されたダイアログにはタイトルが必要です。setTitle()を呼び出さない場合、タイトルに使用されるスペースは空のままですが、表示されます。 tタイトルが必要な場合は、AlertDialogクラスを使用してカスタムダイアログを作成する必要があります。」私は個人的には実験していませんが、カスタムダイアログレイアウトやテーマを使用しても、タイトルスペースを削除することは不可能であることを示唆しています。
スティーブヘイリー

2
2番目の考え:「タイトル」の理解は異なると思います。アプリの上部のタイトルではなく、ポップアップウィンドウの上部のスペースについて話していると思います。
スティーブヘイリー

11
@SteveHaley、次の行を使用して非表示にすることはできませんdialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
Sami Eltamawy

1
必ずdialog.requestWindowFeature(Window.FEATURE_NO_TITLE);を実行してください。ダイアログビューを膨らませる前に。
Alexey Podlasov 2015

585

FEATURE_NO_TITLEは、次のようにダイアログを最初から作成するときに機能します。

Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

ただし、AlertDialogを作成するとき(またはビルダーを使用するとき)は機能しません。これは、タイトルがすでに無効になっており、内部でカスタムのタイトルが使用されているためです。

SDKのソースを確認しましたが、回避できないと思います。したがって、上部の間隔を削除する唯一の解決策は、Dialogクラスを直接使用して、カスタムダイアログを最初からIMOから作成することです。

また、styles.xmlのように、スタイルでそれを行うことができます。

<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

その後:

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);

カスタムダイアログを最初から作成する代わりに、olivergの提案に従ってstyles.xmlを作成しました。次に、マニフェストファイルの<activity> ... </ acitivity>宣言にandroid:theme = "@ style / FullHeightDialog"を追加しました。うまくいきました。おかげで..
インドラジート'17

@oliviergですが、フルハイトダイアログのボタンが必要です。解決策は何ですか?
パセリエ

1
行requestWindowFeature がsetContentView行の前にある必要があることに注意してください
Fattie、2014年

これは実際のコメントに最もよく答えますが、受け入れられた回答の解決策は私の意見では最高です。私はクリーンなでこのように始めDialogましたAlertDialogが、を作成する方がはるかに簡単でした。それがに記載されているとおりドキュメントThe Dialog class is the base class for dialogs, but you should avoid instantiating Dialog directly. Instead, use one of the following subclasses: <AlertDialog and others described here>AlertDialogまた、ライフサイクルのものを処理して、OK /簡単な方法でキャンセル。
Krøllebølle

67

コードに次の行を追加します

requestWindowFeature(Window.FEATURE_NO_TITLE);  

またはXMLでテーマを使用します

android:theme="@android:style/Theme.NoTitleBar"

タイトルバーが作成されて削除されるコードバージョンの場合、XMLはより優れた実装になりますが、これはリソースの浪費です。

よろしいですか、うまくいきません。android.view.WindowManager $ BadTokenException:ウィンドウを追加できません-ダイアログを表示したい場合、アプリケーションに対してトークンnullは使用できません。

警告ダイアログのタイプをシステムダイアログに変更し(例:TYPE_SYSTEM_OVERLAY)、問題が解決するかどうかを確認します


2
requestFeature()の前にsetContentView()を呼び出さないでください。
jlopez 2015年

61

次のように使用します。

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

これにより、ダイアログウィンドウからタイトルバーが削除されます。


3
requestFeature()の前にsetContentView()を呼び出さないでください。
jlopez 2015年

2
後で戻すにはどうすればよいですか?
Android開発者、

58

前に以下のコードを使用してくださいsetcontentview:-

    Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.custom_dialog);

:上記のコードを同じ順序と行で使用する必要があります。 setContentView行の前にあるrequestWindowFeature必要があります。


Dialogfragmentで使用する場合、受け入れられた回答がダイアログフレームと内部コンテンツビューの間に小さな垂直方向のギャップを作成するため、このソリューションは私にとってよりうまく機能します。
セバスチャンロス

38

タイトルを削除できます

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

ここで、ダイアログは私のダイアログの名前です。


requestFeature前にsetContentView()を呼び出さないでください()
jlopez

29

コードで使用する場合はrequestWindowFeature(Window.FEATURE_NO_TITLE); 、それが使用される前に必ず実行してくださいdialog.setContentView();。そうでない場合は、アプリケーションがクラッシュします。


以前試してみるのではなく、明らかに機能することにかなり驚いています。android.developer.comで、カスタムダイアログにタイトルを付けることは必須であると明確に述べているためです。:P
リチャードリン2011

10

私はこれを行う3つの方法を見つけました>

1)requestWindowFeatureの使用

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(dialog.getWindow().FEATURE_NO_TITLE); 

2)スタイル(style.xml)の使用

<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
   <item name="android:windowNoTitle">true</item>
</style>

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);

3)AndroidManifest.xmlでXMLテーマを使用する

 android:theme="@android:style/Theme.NoTitleBar"

1
メソッド1はdialog.requestWindowFeature(Window.FEATURE_NO_TITLE);である必要があります。
Jon Willis

10

Custom_Dialog.javaクラスに追加 requestWindowFeature(Window.FEATURE_NO_TITLE)

public class Custom_Dialog extends Dialog {

    protected Custom_Dialog(Context context, int theme) {
        super(context, theme);
        // TODO Auto-generated constructor stub
        requestWindowFeature(Window.FEATURE_NO_TITLE); //This line 
    }
}

これは私にとってうまくいった唯一のことです...なぜか他のすべての提案はうまくいきませんでした 私がお勧めする唯一のことは、コンストラクターをパブリックにして、コンテキストのみを取る他のダイアログコンストラクターを提供することです
Justin

7

oliviergの答えは私にとってうまくいき、カスタムDialogクラスを作成することが目的のルートである場合は、最良のソリューションです。しかし、AlertDialogクラスを使用できないことに悩みました。デフォルトのシステムAlertDialogスタイルを使用できるようにしたいと思いました。カスタムダイアログクラスの作成には、このスタイルはありません。

そこで、カスタムクラスを作成しなくても機能するソリューション(ハック)を見つけました。既存のビルダーを使用できます。

AlertDialogは、タイトルのプレースホルダーとしてコンテンツビューの上にビューを配置します。ビューを見つけて高さを0に設定すると、スペースはなくなります。

これまでに2.3と3.0でテストしましたが、まだすべてのバージョンで動作しない可能性があります。

これを行うための2つのヘルパーメソッドを次に示します。

/**
 * Show a Dialog with the extra title/top padding collapsed.
 * 
 * @param customView The custom view that you added to the dialog
 * @param dialog The dialog to display without top spacing
     * @param show Whether or not to call dialog.show() at the end.
 */
public static void showDialogWithNoTopSpace(final View customView, final Dialog dialog, boolean show) {
    // Now we setup a listener to detect as soon as the dialog has shown.
    customView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            // Check if your view has been laid out yet
            if (customView.getHeight() > 0) {
                // If it has been, we will search the view hierarchy for the view that is responsible for the extra space. 
                LinearLayout dialogLayout = findDialogLinearLayout(customView);
                if (dialogLayout == null) {
                    // Could find it. Unexpected.

                } else {
                    // Found it, now remove the height of the title area
                    View child = dialogLayout.getChildAt(0);
                    if (child != customView) {
                        // remove height
                        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams();
                        lp.height = 0;
                        child.setLayoutParams(lp);

                    } else {
                        // Could find it. Unexpected.
                    }
                }

                // Done with the listener
                customView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
         }

    });

    // Show the dialog
    if (show)
             dialog.show();
}

/**
 * Searches parents for a LinearLayout
 * 
 * @param view to search the search from
 * @return the first parent view that is a LinearLayout or null if none was found
 */
public static LinearLayout findDialogLinearLayout(View view) {
    ViewParent parent = (ViewParent) view.getParent();
    if (parent != null) {
        if (parent instanceof LinearLayout) {
            // Found it
            return (LinearLayout) parent;

        } else if (parent instanceof View) {
            // Keep looking
            return findDialogLinearLayout((View) parent);

        }
    }

    // Couldn't find it
    return null;
}

使用例は次のとおりです。

    Dialog dialog = new AlertDialog.Builder(this)
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, true);

これをDialogFragmentで使用している場合は、DialogFragmentのonCreateDialogメソッドをオーバーライドします。次に、上記の最初の例のようにダイアログを作成して返します。唯一の変更点は、ダイアログでshow()を呼び出さないように、3番目のパラメーター(show)としてfalseを渡す必要があることです。DialogFragmentは後でそれを処理します。

例:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new AlertDialog.Builder(getContext())
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, false);
    return dialog;
}

これをさらにテストするとき、必要な追加の微調整があれば必ず更新します。


エレガントなソリューション、+ 1。これをDialogFragmentで使用する方法を知っていますか?
Binoy Babu

@Binoyは、DialogFragmentsの回答を更新しました(実際に私が個人的に使用する方法です)
cottonBallPaws '15年

6

この質問が実際にあるかどうかはわかりませんが、私の場合、DialogからDialogFragmentに切り替えたときに、

requestWindowFeature(Window.FEATURE_NO_TITLE);

オプションではありませんでしたが、私は使うことができました

setStyle(STYLE_NO_TITLE, 0);

代わりに同じ結果になります。


setStyle(STYLE_NO_TITLE, 0);わかりやすくするために、この行()はDialogFragmentクラスのonCreateメソッドに入ります。
価格

4

ビルダーを使用して、タイトルを空の文字列に設定します。

    Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("");
...
    builder.show();

3

ダイアログ全体の「重力」属性を「中央」に設定します。次に、その設定を、中央揃えにしたくないダイアログ内のすべての子コンポーネントにオーバーライドする必要があります。


3
dialog=new Dialog(YourActivity.this, 1);  // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);


3

なしで単にダイアログを使用する場合setTitle()、タイトルのスペースを削除することで機能しますか?

mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();

3

これを今すぐ使用できると思います:

AlertDialog dialog = new AlertDialog.Builder(this)
  .setView(view)
  .setTitle("")
  .create()


2
public static AlertDialog showAlertDialogWithoutTitle(Context context,String msg) 
     {
      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
      alertDialogBuilder.setMessage(msg).setCancelable(false)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int id) {

         }
        });

       return alertDialogBuilder.create(); 
     }

2

AlertDialogを使用しているときに、使用しsetTitle()ないとタイトルが消える


1

たくさんのハッキングの後、私はこれを動作させました:

            Window window = dialog.getWindow();
            View view = window.getDecorView();
            final int topPanelId = getResources().getIdentifier( "topPanel", "id", "android" );
            LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId);
            topPanel.setVisibility(View.GONE);

何でdialogこっちとgetResources()
Kartheekの

1

次のようにClass AlertDialogから拡張される新しいClassを定義することにより、使用せずにこれを行うことができますDialog

public class myDialog extends Dialog {
    public myDialog(Context context) {
        super(context);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
}

1

AlertBuilderタイトルを非表示にするためにできることは次のとおりです。

TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);

1

これを使って

    Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.setCancelable(true);
    dialog.setContentView(R.layout.image_show_dialog_layout);

0

dialog_custom .requestWindowFeature(Window.FEATURE_NO_TITLE);

これにより、タイトルがカットソムダイアログから削除されます。

コンテンツを追加する前にこれらの行を追加してください。

     dialog_custom = Dialog(activity!!)
    dialog_custom.requestWindowFeature(Window.FEATURE_NO_TITLE)
    dialog_custom.setContentView(R.layout.select_vehicle_type)
    dialog_custom.setCanceledOnTouchOutside(false)
    dialog_custom.setCancelable(true)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.