web-dev-qa-db-ja.com

AlertDialog:ビューの上下にある黒い境界線を削除する方法

この質問は以前に尋ねられています: 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>

注:ルートとしてFrameLayoutViewGroupではなくLinearLayoutとして使用してみました私がどこかで見つけた提案-しかし、それは助けにはなりませんでした。

結果

enter image description hereenter image description here


setBackgroundDrawableの提案

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();
    }
}

私のために働いていませんでした。

30
Steve

AlertDialogクラスのソース を見ると、ほとんどのメソッドはprivate AlertController mAlertの周りのプロキシメソッド(ファサード)にすぎないことがわかります。

AlertController class source を見ると、4つの興味深いメンバー変数が表示されます。

private int mViewSpacingLeft;
private int mViewSpacingTop;
private int mViewSpacingRight;
private int mViewSpacingBottom;
private boolean mViewSpacingSpecified = false;

mViewSpacingSpecifiedtrueに設定すると、ダイアログの上部と下部の境界線が削除されます。

これは、次の行を変更することで適切に行われます。

dialog.setView(layout);

に:

dialog.setView(layout, 0, 0, 0, 0);
39
Steve
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"を削除してみてください。

8
Shankar Agarwal

私の場合、その境界はAlertDialogの親アクティビティのテーマが原因でした。ボーダーを完全に取り除くには、別のテーマ(この場合はHolo)を指定します。

AlertDialog.Builder builder = new AlertDialog.Builder(
                                new ContextThemeWrapper(this, Android.R.style.Theme_Holo)
                              );

これで解決しました。お役に立てれば!

6
Prismatica

スティーブの答えをより明確にするために、これは簡単に行うことができます。たとえば、私の場合、ダイアログで設定していたビューは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;
}
1
jsidera
setBackgroundDrawable(new ColorDrawable(0));

ダイアログでこれを呼び出します。

0
Changwei Yao