it-swarm.asia

كيفية تغيير موضوع AlertDialog

كنت أتساءل ما إذا كان شخص ما يمكن أن يساعدني. أحاول إنشاء AlertDialog مخصص. للقيام بذلك ، أضفت السطر التالي من التعليمات البرمجية في styles.xml

<resources>
 <style name="CustomAlertDialog" parent="Android:Theme.Dialog.Alert">
  <item name="Android:windowBackground">@drawable/color_panel_background</item>
 </style>
</resources>
  • يقع color_panel_background.9.png في مجلد قابل للفرد. يتوفر هذا أيضًا في مجلد الدقة Android SDK.

ما يلي هو النشاط الرئيسي.

package com.customdialog;

import Android.app.Activity;
import Android.app.AlertDialog;
import Android.app.Dialog;
import Android.content.DialogInterface;
import Android.os.Bundle;

public class CustomDialog extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        this.setTheme(R.style.CustomAlertDialog);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("HELLO!");
        builder .setCancelable(false)
          .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               //MyActivity.this.finish();
           }
       })
       .setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               //dialog.cancel();
           }
       });

        AlertDialog alertdialog = builder.create();
        alertdialog.show();
    }
}

لتطبيق السمة على AlertDialog ، اضطررت إلى تعيين السمة على السياق الحالي.

ومع ذلك ، لا يمكنني الحصول على التطبيق لإظهار AlertDialog المخصص. يمكن لأي شخص مساعدتي في هذا؟

214
Min Soo Kim

في Dialog.Java (Android src) ، يتم استخدام ContextThemeWrapper. لذلك يمكنك نسخ الفكرة والقيام بشيء مثل:

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

ثم صممها كما تريد:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AlertDialogCustom" parent="@Android:style/Theme.Dialog">
        <item name="Android:textColor">#00FF00</item>
        <item name="Android:typeface">monospace</item>
        <item name="Android:textSize">10sp</item>
    </style>
</resources>
338
Arve Waltin

كنت أواجه هذا الموضوع المتعلق بـ AlertDialog باستخدام sdk 1.6 كما هو موضح هنا: http://markmail.org/message/mj5ut56irkrkc4nr

لقد قمت بحل المشكلة بالقيام بما يلي:

  new AlertDialog.Builder(
  new ContextThemeWrapper(context, Android.R.style.Theme_Dialog))

أتمنى أن يساعدك هذا.

89
chee

لقد كتبت مقالة في مدونتي عن كيفية تكوين تخطيط AlertDialog مع ملفات نمط XML. المشكلة الرئيسية هي أنك تحتاج إلى تعريفات نمط مختلفة لمعلمات تخطيط مختلفة. في ما يلي نموذج نحاسي يستند إلى نمط AlertDialog من Holo Light Platform ، الإصدار 19 لملف النمط الذي يجب أن يغطي مجموعة من جوانب التخطيط القياسية مثل أحجام النص وألوان الخلفية.

<style name="AppBaseTheme" parent="Android:Theme.Holo.Light">
    ...
    <item name="Android:alertDialogTheme">@style/MyAlertDialogTheme</item>
    <item name="Android:alertDialogStyle">@style/MyAlertDialogStyle</item>
    ...
</style>

<style name="MyBorderlessButton">
    <!-- Set background drawable and text size of the buttons here -->
    <item name="Android:background">...</item>
    <item name="Android:textSize">...</item>
</style>

<style name="MyButtonBar">
    <!-- Define a background for the button bar and a divider between the buttons here -->
    <item name="Android:divider">....</item>
    <item name="Android:dividerPadding">...</item>
    <item name="Android:showDividers">...</item>
    <item name="Android:background">...</item>
</style>

<style name="MyAlertDialogTitle">
    <item name="Android:maxLines">1</item>
    <item name="Android:scrollHorizontally">true</item>
</style>

<style name="MyAlertTextAppearance">
    <!-- Set text size and color of title and message here -->
    <item name="Android:textSize"> ... </item>
    <item name="Android:textColor">...</item>
</style>

<style name="MyAlertDialogTheme">
    <item name="Android:windowBackground">@Android:color/transparent</item>
    <item name="Android:windowTitleStyle">@style/MyAlertDialogTitle</item>
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:windowMinWidthMajor">@Android:dimen/dialog_min_width_major</item>
    <item name="Android:windowMinWidthMinor">@Android:dimen/dialog_min_width_minor</item>
    <item name="Android:windowIsFloating">true</item>
    <item name="Android:textAppearanceMedium">@style/MyAlertTextAppearance</item>
    <!-- If you don't want your own button bar style use
            @Android:style/Holo.Light.ButtonBar.AlertDialog
            and
            ?android:attr/borderlessButtonStyle
         instead of @style/MyButtonBar and @style/MyBorderlessButton -->
    <item name="Android:buttonBarStyle">@style/MyButtonBar</item>
    <item name="Android:buttonBarButtonStyle">@style/MyBorderlessButton</item>
</style>

<style name="MyAlertDialogStyle">
    <!-- Define background colors of title, message, buttons, etc. here -->
    <item name="Android:fullDark">...</item>
    <item name="Android:topDark">...</item>
    <item name="Android:centerDark">...</item>
    <item name="Android:bottomDark">...</item>
    <item name="Android:fullBright">...</item>
    <item name="Android:topBright">...</item>
    <item name="Android:centerBright">...</item>
    <item name="Android:bottomBright">...</item>
    <item name="Android:bottomMedium">...</item>
    <item name="Android:centerMedium">...</item>
</style>
61
Nantoka

كنت أعاني من هذا - يمكنك تصميم خلفية مربع الحوار باستخدام Android:alertDialogStyle="@style/AlertDialog" في نسختك ، لكنه يتجاهل أي إعدادات نصية لديك. كما ذكر @ rflexor أعلاه ، لا يمكن القيام به مع SDK قبل قرص العسل (يمكنك استخدام Reflection).

كان الحل الخاص بي باختصار هو تصميم خلفية مربع الحوار باستخدام ما سبق ، ثم تعيين عنوان مخصص وعرض المحتوى (باستخدام تخطيطات مماثلة لتلك الموجودة في SDK).

غلافي:

import com.mypackage.R;

import Android.app.AlertDialog;
import Android.content.Context;
import Android.graphics.drawable.Drawable;
import Android.view.View;
import Android.widget.ImageView;
import Android.widget.TextView;

public class CustomAlertDialogBuilder extends AlertDialog.Builder {

    private final Context mContext;
    private TextView mTitle;
    private ImageView mIcon;
    private TextView mMessage;

    public CustomAlertDialogBuilder(Context context) {
        super(context);
        mContext = context; 

        View customTitle = View.inflate(mContext, R.layout.alert_dialog_title, null);
        mTitle = (TextView) customTitle.findViewById(R.id.alertTitle);
        mIcon = (ImageView) customTitle.findViewById(R.id.icon);
        setCustomTitle(customTitle);

        View customMessage = View.inflate(mContext, R.layout.alert_dialog_message, null);
        mMessage = (TextView) customMessage.findViewById(R.id.message);
        setView(customMessage);
    }

    @Override
    public CustomAlertDialogBuilder setTitle(int textResId) {
        mTitle.setText(textResId);
        return this;
    }
    @Override
    public CustomAlertDialogBuilder setTitle(CharSequence text) {
        mTitle.setText(text);
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setMessage(int textResId) {
        mMessage.setText(textResId);
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setMessage(CharSequence text) {
        mMessage.setText(text);
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setIcon(int drawableResId) {
        mIcon.setImageResource(drawableResId);
        return this;
    }

    @Override
    public CustomAlertDialogBuilder setIcon(Drawable icon) {
        mIcon.setImageDrawable(icon);
        return this;
    }

}

alert_dialog_title.xml (مأخوذة من SDK)

<?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:orientation="vertical"
    >
    <LinearLayout
            Android:id="@+id/title_template"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:orientation="horizontal"
            Android:gravity="center_vertical"
            Android:layout_marginTop="6dip"
            Android:layout_marginBottom="9dip"
            Android:layout_marginLeft="10dip"
            Android:layout_marginRight="10dip">

            <ImageView Android:id="@+id/icon"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_gravity="top"
                Android:paddingTop="6dip"
                Android:paddingRight="10dip"
                Android:src="@drawable/ic_dialog_alert" />
            <TextView Android:id="@+id/alertTitle"
                style="@style/?android:attr/textAppearanceLarge"
                Android:singleLine="true"
                Android:ellipsize="end"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content" />
        </LinearLayout>
        <ImageView Android:id="@+id/titleDivider"
            Android:layout_width="fill_parent"
            Android:layout_height="1dip"
            Android:scaleType="fitXY"
            Android:gravity="fill_horizontal"
            Android:src="@drawable/divider_horizontal_bright" />
</LinearLayout>

alert_dialog_message.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:id="@+id/scrollView"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:paddingTop="2dip"
            Android:paddingBottom="12dip"
            Android:paddingLeft="14dip"
            Android:paddingRight="10dip">
    <TextView Android:id="@+id/message"
                style="?android:attr/textAppearanceMedium"
                Android:textColor="@color/dark_grey"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:padding="5dip" />
</ScrollView>

ثم استخدم فقط CustomAlertDialogBuilder بدلاً من AlertDialog.Builder لإنشاء مربعات الحوار الخاصة بك ، فقط اتصل بـ setTitle و setMessage كالمعتاد.

31
Joseph Earl
 <style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Used for the buttons -->
    <item name="colorAccent">@color/colorAccent</item>
    <!-- Used for the title and text -->
    <item name="Android:textColorPrimary">#FFFFFF</item>
    <!-- Used for the background -->
    <item name="Android:background">@color/teal</item>
</style>





new AlertDialog.Builder(new ContextThemeWrapper(context,R.style.AlertDialogCustom))
            .setMessage(Html.fromHtml(Msg))
            .setPositiveButton(posBtn, okListener)
            .setNegativeButton(negBtn, null)
            .create()
            .show();
26
saigopi

يمكنك تعيين سمة مباشرة عند بدء البناء:

AlertDialog.Builder builder = new AlertDialog.Builder(
                    getActivity(), R.style.MyAlertDialogTheme);

ثم خصص المظهر الخاص بك في values/styles.xml

<!-- Alert Dialog -->
<style name="MyAlertDialogTheme" parent="Theme.AppCompat.Dialog.Alert">
    <item name="colorAccent">@color/colorAccent</item>
    <item name="Android:colorBackground">@color/alertDialogBackground</item>
    <item name="Android:windowBackground">@color/alertDialogBackground</item>
</style>
19
pha

أعتقد أنه لا يمكن القيام به. على الأقل ليس مع باني. أنا أعمل مع 1.6 والتنفيذ في Builder.create () هو:

public AlertDialog create() {
    final AlertDialog dialog = new AlertDialog(P.mContext);
    P.apply(dialog.mAlert);
    [...]
}

الذي يستدعي مُنشئ "AlertDialog" الذي لا يعرف موضوعًا ، والذي يبدو كالتالي:

protected AlertDialog(Context context) {
    this(context, com.Android.internal.R.style.Theme_Dialog_Alert);
}

يوجد مُنشئ ثاني في AlertDialog لتغيير السمات:

protected AlertDialog(Context context, int theme) {
    super(context, theme);
    [...]
}

أن باني فقط لا يتصل.

إذا كان مربع الحوار عامًا على أي حال ، فسوف أحاول كتابة فئة فرعية من AlertDialog ، واستدعي المنشئ الثاني واستخدم تلك الفئة بدلاً من آلية البناء.

8
rflexor

أفضل طريقة للقيام بذلك استخدام مربع حوار مخصص وتخصيص حسب احتياجاتك هنا هو مثال مربع حوار مخصص .....

enter image description here

public class CustomDialogUI {
Dialog dialog;
Vibrator vib;
RelativeLayout rl;

@SuppressWarnings("static-access")
public void dialog(final Context context, String title, String message,
        final Runnable task) {
    dialog = new Dialog(context);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.custom);
    dialog.setCancelable(false);
    TextView m = (TextView) dialog.findViewById(R.id.message);
    TextView t = (TextView) dialog.findViewById(R.id.title);
    final Button n = (Button) dialog.findViewById(R.id.button2);
    final Button p = (Button) dialog.findViewById(R.id.next_button);
    rl = (RelativeLayout) dialog.findViewById(R.id.rlmain);
    t.setText(bold(title));
    m.setText(message);
    dialog.show();
    n.setText(bold("Close"));
    p.setText(bold("Ok"));
    // color(context,rl);
    vib = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE);
    n.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            vib.vibrate(15);
            dialog.dismiss();
        }
    });
    p.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            vib.vibrate(20);
            dialog.dismiss();
            task.run();
        }
    });
}
 //customize text style bold italic....
public SpannableString bold(String s) {
    SpannableString spanString = new SpannableString(s);
    spanString.setSpan(new StyleSpan(Typeface.BOLD), 0,
            spanString.length(), 0);
    spanString.setSpan(new UnderlineSpan(), 0, spanString.length(), 0);
    // spanString.setSpan(new StyleSpan(Typeface.ITALIC), 0,
    // spanString.length(), 0);
    return spanString;
}

}

هنا هو تخطيط XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#00000000"
>

<RelativeLayout
    Android:id="@+id/rlmain"
    Android:layout_width="fill_parent"
    Android:layout_height="150dip"
    Android:layout_alignParentLeft="true"
    Android:layout_centerVertical="true"
    Android:background="#569CE3" >

    <RelativeLayout
        Android:id="@+id/relativeLayout1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:layout_alignParentTop="true"
        Android:layout_centerHorizontal="true"
        Android:layout_marginLeft="25dip"
        Android:layout_marginTop="10dip" >

        <TextView
            Android:id="@+id/title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentLeft="true"
            Android:layout_alignParentTop="true"
            Android:text="Are you Sure?"
            Android:textAppearance="?android:attr/textAppearanceMedium"
            Android:textColor="#ffffff"
            Android:textSize="13dip" />
    </RelativeLayout>

    <RelativeLayout
        Android:id="@+id/relativeLayout2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignLeft="@+id/relativeLayout1"
        Android:layout_alignRight="@+id/relativeLayout1"
        Android:layout_below="@+id/relativeLayout1"
        Android:layout_marginTop="5dip" >
    </RelativeLayout>

    <ProgressBar
        Android:id="@+id/process"
        style="?android:attr/progressBarStyleSmall"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentRight="true"
        Android:layout_alignParentTop="true"
        Android:layout_marginRight="3dip"
        Android:layout_marginTop="3dip" />

    <RelativeLayout
        Android:id="@+id/relativeLayout3"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_alignLeft="@+id/relativeLayout2"
        Android:layout_below="@+id/relativeLayout2"
        Android:layout_toLeftOf="@+id/process" >

        <TextView
            Android:id="@+id/message"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentLeft="true"
            Android:layout_centerVertical="true"
            Android:text="Medium Text"
            Android:textAppearance="?android:attr/textAppearanceMedium"
            Android:textColor="#ffffff"
            Android:textSize="13dip"/>

    </RelativeLayout>

    <Button
        Android:id="@+id/next_button"
        Android:layout_width="90dip"
        Android:layout_height="35dip"
        Android:layout_alignParentBottom="true"
        Android:textColor="@drawable/button_text_color"
         Android:background="@drawable/blue_button"
         Android:layout_marginBottom="5dp"
           Android:textSize="10dp"

        Android:layout_alignRight="@+id/relativeLayout3"
        Android:text="Okay" />

    <Button
        Android:id="@+id/button2"
        Android:text="Cancel"
        Android:textColor="@drawable/button_text_color"
        Android:layout_width="90dip"
        Android:layout_height="35dip"
        Android:layout_marginBottom="5dp"
         Android:background="@drawable/blue_button"
         Android:layout_marginRight="7dp"
        Android:textSize="10dp"
        Android:layout_alignParentBottom="true"
        Android:layout_toLeftOf="@+id/next_button"
         />

</RelativeLayout>
4
user2671902

بالنسبة للحوار المخصص:

فقط اتصل بـ super(context,R.style.<dialog style>) بدلاً من super(context) في مُنشئ الحوار

public class MyDialog extends Dialog
{
    public MyDialog(Context context)
    {
       super(context, R.style.Theme_AppCompat_Light_Dialog_Alert)
    }
}


لـ AlertDialog:

مجرد إنشاء alertDialog مع هذا المنشئ:

 new AlertDialog.Builder(
 new ContextThemeWrapper(context, Android.R.style.Theme_Dialog))
4
Amir Hossein Ghasemi

يجب على أي شخص يحاول القيام بذلك ضمن جزء (باستخدام مكتبة الدعم أي قبل API 11) أن يوافق على ذلك:

public class LoadingDialogFragment extends DialogFragment {
    public static final String ID = "loadingDialog";

    public static LoadingDialogFragment newInstance() {
        LoadingDialogFragment f = new LoadingDialogFragment();

        return f;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        StyleAlertDialog adb = new StyleAlertDialog(getActivity(), R.style.Your_Style);
        adb.setView(getActivity().getLayoutInflater().inflate(R.layout.fragment_dialog_layout, null));
        return adb;
    }

    private class StyleAlertDialog extends AlertDialog {
        protected StyleAlertDialog(Context context, int theme) {
            super(context, theme);
        }
    }
}

أعطانيRflexor Nudge لتمديد AlertDialog وفضح الشكر للمنشئ

3
Blundell

يبدو حل Arve Waltin جيدًا ، رغم أنني لم أختبره بعد. يوجد حل آخر في حال واجهتك مشكلة في الحصول على هذا العمل .... قم بتوسيع AlertDialog.Builder وتجاوز كل الأساليب (على سبيل المثال ، setText ، setTitle ، setView ، إلخ) لعدم ضبط نص/عرض/حوار Dialog الفعلي ، ولكن لإنشاء طريقة عرض جديدة داخل عرض مربع الحوار تفعل كل شيء هناك. إذن أنت حر في تصميم كل شيء كما يحلو لك.

للتوضيح ، فيما يتعلق بالفصل الأصل ، يتم تعيين "العرض" ، ولا شيء آخر.

بقدر ما يتعلق الأمر بالصف الموسعة المخصصة الخاصة بك ، يتم كل شيء ضمن هذا الرأي.

2
Steven L

يمكن القيام به ببساطة باستخدام setView () منشئ. يمكنك إنشاء أي عرض من اختيارك وتغذيته في المنشئ. هذا يعمل بشكل جيد. يمكنني استخدام TextView مخصص يتم تقديمه بواسطة أداة إنشاء الحوار. لا أقوم بتعيين الرسالة ويتم استخدام هذه المساحة لتقديم وجهة نظري النصية.

0
AKh