Bagaimana cara mengubah tema untuk AlertDialog


242

Saya bertanya-tanya apakah seseorang dapat membantu saya. Saya mencoba membuat AlertDialog kustom. Untuk melakukan ini, saya menambahkan baris kode berikut di 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 terletak di folder yang dapat digambar. Ini juga tersedia di folder res Android SDK.

Berikut ini adalah kegiatan utama.

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

Untuk menerapkan tema ke AlertDialog, saya harus mengatur tema ke konteks saat ini.

Namun, saya sepertinya tidak bisa mendapatkan aplikasi untuk menampilkan AlertDialog yang disesuaikan. Adakah yang bisa membantu saya dengan ini?



Saya menemukan repo ini di github sangat membantu: github.com/StylingAndroid/AlertDialog
esilver

Jawaban:


363

Di Dialog.java (Android src) digunakan ContextThemeWrapper. Jadi, Anda dapat menyalin ide dan melakukan sesuatu seperti:

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

Dan gaya itu seperti yang Anda inginkan:

<?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>

62
Jangan gunakan @android: style / AlertDialog. Itu tidak ada di API publik. Akibatnya, di Android 2.3.3, macet saat membuat pembangun.
Catalin Morosan

18
@kaciula Apakah @android:style/Theme.Dialogpublik? Bisakah itu digunakan?
HRJ

24
Iya. Itu milik umum. Lihat developer.android.com/reference/android/R.style.html untuk daftar semua gaya publik. Perlu diingat bahwa penamaan dalam API berbeda dari yang digunakan dalam kode. Ada '_' bukannya "." (Theme_Dialog)
Catalin Morosan

2
Di mana saya harus meletakkan file xml di atas?
Chaitanya Chandurkar

3
Untuk tema yang lebih baru yang merupakan bagian dari tema kompatibilitas, saya sarankan menggunakan Theme.AppCompat.Light.Dialog.Alertgaya sebagai induk dari gaya kustom Anda. Tetapi, jika Anda melakukan ini, pastikan Anda mengimpor import android.support.v7.app.AlertDialog; dan tidakimport android.app.AlertDialog
w3bshark

93

Saya mengalami AlertDialogmasalah terkait tema ini menggunakan SDK 1.6 seperti dijelaskan di sini: http://markmail.org/message/mj5ut56irkrkc4nr

Saya memecahkan masalah dengan melakukan hal berikut:

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

Semoga ini membantu.


2
Ada beberapa tema yang relevan; dalam kasus saya android.R.style.Theme_Holo_Dialog lebih cocok. Tip yang bagus.
Johnny O

78

Saya telah menulis artikel di blog saya tentang cara mengkonfigurasi tata letak AlertDialog dengan file gaya XML. Masalah utama adalah bahwa Anda memerlukan definisi gaya yang berbeda untuk parameter tata letak yang berbeda. Berikut ini adalah pelat dasar berdasarkan gaya AlertDialog dari Holo Light Platform versi 19 untuk file gaya yang harus mencakup banyak aspek tata letak standar seperti ukuran teks dan warna latar belakang.

<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>

2
dapatkah saya bertanya mengapa kita berdua membutuhkan gaya dan tema untuk penyesuaian AlertDialog? Terima kasih banyak! @nantoka
brainvision

2
@brainvision Entri blog saya memiliki detail tetapi singkatnya tata letak AlertDialog berasal dari dua kelas yang berbeda (Dialog dan AlertController) yang menggunakan file param tata letak yang berbeda.
Nantoka

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

3
Solusi paling simpel namun cepat!
FonzTech

4
OK, bagaimana kalau menggunakan beberapa atribut untuk mendeklarasikannya secara global di "AppTheme"?
deadfish

2
Ini membantu saya mengubah warna tombol dialog.
icarovirtual

1
Terima kasih teman saya, Anda menyelamatkan minggu saya !!
Clifton Steenkamp

31

Saya kesulitan dengan ini - Anda dapat mengatur latar belakang dialog menggunakan android:alertDialogStyle="@style/AlertDialog"tema Anda, tetapi mengabaikan semua pengaturan teks yang Anda miliki. Seperti @rflexor mengatakan di atas itu tidak dapat dilakukan dengan SDK sebelum Honeycomb (baik Anda bisa menggunakan Reflection).

Solusi saya, singkatnya, adalah gaya latar belakang dialog menggunakan di atas, kemudian atur judul kustom dan tampilan konten (menggunakan tata letak yang sama dengan yang ada di SDK).

Pembungkus saya:

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 (diambil dari 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>

Kemudian gunakan saja CustomAlertDialogBuilderalih-alih AlertDialog.Builderuntuk membuat dialog Anda, dan panggil saja setTitledan setMessageseperti biasa.


3
bagaimana Anda mengakses android.R.internal.id.alerttitle?
Gilbert

2
Saya tidak, saya mengakses R.id.alertTitle
Joseph Earl

28

Anda dapat langsung menetapkan tema saat Anda memulai Builder:

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

Kemudian sesuaikan tema Anda di 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>

1
Sempurna. Satu-satunya hal yang saya gunakanTheme.AppCompat.Light.Dialog.Alert
ekashking

11

Untuk Dialog Kustom:

panggil saja super(context,R.style.<dialog style>)bukan super(context)di konstruktor dialog

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


Untuk AlertDialog:

Cukup buat alertDialog dengan konstruktor ini:

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

1
Tidak perlu memperpanjang Dialog dengan kelas kosong baru, karena sudah ada versi konstruktor yang mengambil gaya tema.
FindOut_Quran

@FindOut_Quran Intinya adalah untuk menunjukkan cara mengganti gaya di kelas Dialog khusus. Ini hanya sebuah contoh, kelas Dialog Anda yang sebenarnya akan memiliki beberapa kode lain di dalamnya.
Niall

8

Saya kira itu tidak bisa dilakukan. Setidaknya tidak dengan Builder. Saya bekerja dengan 1.6 dan Implementasi di Builder.create () adalah:

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

yang menyebut konstruktor "not-theme-aware" dari AlertDialog, yang terlihat seperti ini:

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

Ada konstruktor kedua di AlertDialog untuk mengubah tema:

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

bahwa Builder tidak menelepon.

Jika Dialog itu cukup generik, saya akan mencoba menulis subkelas AlertDialog, memanggil konstruktor kedua dan menggunakan kelas itu alih-alih mekanisme Builder.


4

Cara yang lebih baik untuk melakukan ini menggunakan dialog khusus dan menyesuaikan sesuai kebutuhan Anda di sini adalah contoh dialog khusus .....

masukkan deskripsi gambar di sini

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

}

Berikut ini adalah tata letak 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>


7
Mereka dan menggunakan tampilan kustom adalah 2 hal yang berbeda dan memiliki tujuan berbeda.
jmc34

3

Siapa pun yang mencoba melakukan ini dalam Fragmen (menggunakan perpustakaan dukungan yaitu pra API 11) harus pergi dengan ini:

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 memberi saya dorongan untuk memperpanjang AlertDialog dan mengekspos konstruktor terima kasih


Konstruktor AlertDialog.Builder(Context, int)hanya berfungsi pada API 11 dan di atasnya. Kode Anda akan macet pada versi Android sebelumnya.
Joseph Earl

@JosephEarl (menggunakan perpustakaan dukungan yaitu pra API 11)
Blundell

Sayangnya, Anda menggunakan konstruktor dialog dan bukan konstruktor dialog builder.
Joseph Earl

2

Solusi Arve Waltin terlihat bagus, meskipun saya belum mengujinya. Ada solusi lain jika Anda memiliki kesulitan mendapatkan bahwa untuk pekerjaan .... Perluas AlertDialog.Builderdan menimpa semua metode (misalnya. setText, setTitle,setView , Dll) tidak mengatur sebenarnya Dialog ini text / title / view, tetapi untuk menciptakan tampilan baru dalam Tampilan Dialog melakukan segalanya di sana. Maka Anda bebas untuk mengatur semuanya sesuka Anda.

Untuk memperjelas, sejauh menyangkut kelas induk, tampilan diatur, dan tidak ada yang lain.

Sejauh menyangkut kelas khusus kebiasaan Anda, semuanya dilakukan dalam tampilan itu.


0

Saya tidak yakin bagaimana solusi Arve akan bekerja dalam Dialog kustom dengan pembangun tempat tampilan meningkat melalui LayoutInflator.

Solusinya adalah dengan memasukkan ContextThemeWrapper ke inflator melalui cloneInContext():

View sensorView = LayoutInflater.from(context).cloneInContext(
     new ContextThemeWrapper(context, R.style.AppTheme_DialogLight)
).inflate(R.layout.dialog_fingerprint, null);

-1

Ini dapat dilakukan hanya dengan menggunakan setView Builder (). Anda dapat membuat tampilan pilihan Anda dan memasukkannya ke dalam pembuat. Ini bekerja dengan baik. Saya menggunakan TextView khusus yang diberikan oleh pembuat dialog. Saya tidak mengatur pesan dan ruang ini digunakan untuk membuat tampilan teks custome saya.


-12
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title");
builder.setMessage("Description");
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();

Apakah Anda keberatan memformat kode Anda dengan cuplikan kode bawaan?
Adriano
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.