この質問は以前に尋ねられています: AlertDialogカスタムタイトルに黒い境界線があります
しかし、満足のいく答えが得られなかった-いくつかの情報が欠けている。
私はAndroidにカスタムダイアログを作成しようとしています。タイトルも下部のボタンもありません。
ただし、結果のダイアログには、ビューの上部と下部に沿って黒い「境界線」/「間隔」/何かが表示されます。
ドキュメント から:
基本Dialogクラスで作成されたダイアログには、タイトルが必要です。 setTitle()を呼び出さない場合、タイトルに使用されるスペースは空のままですが、表示されたままです。タイトルがまったく必要ない場合は、AlertDialogクラスを使用してカスタムダイアログを作成する必要があります。ただし、AlertDialogはAlertDialog.Builderクラスを使用すると最も簡単に作成されるため、上記で使用したsetContentView(int)メソッドにアクセスできません。代わりに、setView(View)を使用する必要があります。このメソッドはViewオブジェクトを受け入れるため、XMLからレイアウトのルートViewオブジェクトを拡張する必要があります。
だから、それは私がやったことです:
Welcome.Java
public class Welcome extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.welcomedialog, (ViewGroup)findViewById(R.id.layout_root));
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(layout);
builder.create().show();
}
}
welcomedialog.xml
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:background="@drawable/texturebg"
Android:id="@+id/layout_root"
Android:orientation="vertical"
Android:padding="40px">
...
</LinearLayout>
注:ルートとしてFrameLayout
をViewGroup
ではなくLinearLayout
として使用してみました私がどこかで見つけた提案-しかし、それは助けにはなりませんでした。
結果
public class Welcome extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.welcomedialog, (ViewGroup)findViewById(R.id.layout_root));
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(layout);
AlertDialog dialog = builder.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
dialog.show();
}
}
私のために働いていませんでした。
AlertDialogクラスのソース を見ると、ほとんどのメソッドはprivate AlertController mAlert
の周りのプロキシメソッド(ファサード)にすぎないことがわかります。
AlertController class source を見ると、4つの興味深いメンバー変数が表示されます。
private int mViewSpacingLeft;
private int mViewSpacingTop;
private int mViewSpacingRight;
private int mViewSpacingBottom;
private boolean mViewSpacingSpecified = false;
mViewSpacingSpecified
をtrue
に設定すると、ダイアログの上部と下部の境界線が削除されます。
これは、次の行を変更することで適切に行われます。
dialog.setView(layout);
に:
dialog.setView(layout, 0, 0, 0, 0);
dialog.setInverseBackgroundForced(true);
コードで上記を使用して、アラートダイアログの境界線を削除します。
InverseBackgroundForcedについては、これを参照してください [〜#〜] link [〜#〜] 。
[〜#〜]更新[〜#〜]次のコードを試してください::::
public class Welcome extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
AlertDialog.Builder builder = new AlertDialog.Builder(Welcome.this);
LayoutInflater _inflater = LayoutInflater.from(Welcome.this);
View view = _inflater.inflate(R.layout.welcomedialog,null);
builder.setView(view);
AlertDialog alert = builder.create();
alert.show();
}
}
注::また、welcomedialog.xmlからAndroid:padding = "40px"を削除してみてください。
私の場合、その境界はAlertDialogの親アクティビティのテーマが原因でした。ボーダーを完全に取り除くには、別のテーマ(この場合はHolo)を指定します。
AlertDialog.Builder builder = new AlertDialog.Builder(
new ContextThemeWrapper(this, Android.R.style.Theme_Holo)
);
これで解決しました。お役に立てれば!
スティーブの答えをより明確にするために、これは簡単に行うことができます。たとえば、私の場合、ダイアログで設定していたビューはWebViewでした。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
WebView webView = new WebView(getActivity());
webView.loadUrl(" url to show ");
OnClickListener clickListenerOk = new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
...
}
};
OnClickListener clickListenerCancel = new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
...
}
};
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setPositiveButton("OK", clickListenerOk)
.setNegativeButton("Cancel",clickListenerCancel)
.create();
dialog.setView(webView, 0, 0, 0, 0);
return dialog;
}
setBackgroundDrawable(new ColorDrawable(0));
ダイアログでこれを呼び出します。