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 Pointer Exceptionが表示されます。ダイアログがnullではないため、取得しようとしているTextViewが存在しません。
Dialog Constructorを使用している部分のコメントを外しても、ダイアログレイアウトの上のタイトル以外はすべてうまくいきます。
あなたはダイアログのタイトルを隠すことができます:
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がnr
のTextViewがView view = inflater....
で膨らませているビューにあると仮定します。もしそうなら、1ビットだけ変更する必要があります:dialog.findView...
の代わりにそれをview.findView...
にします。それが終わったら、builder.create()を煩わさずにdialog.show()、あるいはbuilder.show()を使用することを忘れないでください。
FEATURE_NO_TITLEは、次のようにダイアログを最初から作成するときに機能します。
Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
ただし、AlertDialogを作成するとき(またはBuilderを使用するとき)には機能しません。なぜなら、それは既にタイトルを無効にし、カスタムのタイトルを内部的に使用するからです。
私は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);
あなたのコードでこの行を追加
requestWindowFeature(Window.FEATURE_NO_TITLE);
XMLではテーマを使う
Android:theme="@Android:style/Theme.NoTitleBar"
XMLは、タイトルバーが作成されてから削除されるコードバージョンと同様に、より良い実装になるでしょう。これはリソースの無駄です。
[OK]を試してみますが、動作していませんAndroid.view.WindowManager $ BadTokenException:ウィンドウを追加できません - ダイアログを縮小したい場合、トークンnullはアプリケーションにはありません。
警告ダイアログの種類をシステムダイアログに変更し(例:TYPE_SYSTEM_OVERLAY)、これで問題が解決するかどうかを確認します。
このように使用してください:
Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
これにより、ダイアログウィンドウからタイトルバーが削除されます。
setcontentview
の前に以下のコードを使用してください -
Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);
注:上記のコードを同じ順序で同じ行に並べる必要があります。 requestWindowFeature
は、前 setContentView行にする必要があります。
タイトルを削除することができます
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialogは私のダイアログの名前です。
あなたのコードでrequestWindowFeature(Window.FEATURE_NO_TITLE);
を使う場合、それがdialog.setContentView();
の前にあることを確認してください。そうでなければアプリケーションがクラッシュします。
私はこれを行うためのスリーウェイを見つけました>
1)requestWindowFeatureを使う
Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(dialog.getWindow().FEATURE_NO_TITLE);
2)style(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"
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
}
}
olivierg's answer 私のために働いていて、カスタム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;
}
これをさらにテストしながら、必要な追加の調整を必ず加えて更新します。
この質問がまだ実際のものであるかどうかはわかりませんが、私の場合は、DialogからDialogFragmentに切り替えたときに、
requestWindowFeature(Window.FEATURE_NO_TITLE);
オプションではありませんでしたが、私は使用することができます
setStyle(STYLE_NO_TITLE, 0);
代わりに同じ結果になります。
Builderを使用してタイトルを空の文字列に設定します。
Builder builder = new AlertDialog.Builder(context);
builder.setTitle("");
...
builder.show();
ダイアログ全体の「gravity」属性を「center」に設定します。次に、ダイアログの中心に配置したくないすべての子コンポーネントに対して、その設定を上書きする必要があります。
dialog=new Dialog(YourActivity.this, 1); // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);
単にsetTitle()
なしでダイアログを使用するのであれば、タイトルのスペースを削除することでうまくいくのでしょうか。
mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();
xMLではテーマを使う
Android:theme="@Android:style/Theme.NoTitleBar"
あなたは今これを使うことができると思います:
AlertDialog dialog = new AlertDialog.Builder(this)
.setView(view)
.setTitle("")
.create()
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
"Loading. Please wait...", true);
タイトルなしダイアログを作成します
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();
}
AlertDialogを使用しているときにsetTitle()
を使用しないとタイトルが消えます。
AlertDialog
クラスから拡張する新しいクラスを次のように定義することで、Dialog
を使用せずにこれを実行できます。
public class myDialog extends Dialog {
public myDialog(Context context) {
super(context);
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
}
たくさんのハッキングの後、私はこれがうまくいくようにしました:
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 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);
これは、タイトルを消すためにAlertBuilder
でできることです。
TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);
dialog_custom .requestWindowFeature(Window.FEATURE_NO_TITLE);
これはcutsomダイアログからタイトルを削除します。
コンテンツを追加する前にこれらの行を追加してください。
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)