Android AlertDialog的使用

AlertDialog 的介绍

  1. AlertDialog的方法
返回值 方法名
open Button! getButton(whichButton: Int) 获获取对话框中使用的按钮之一。如果指定的按钮不存在或对话框尚未完全创建(例如,通过 show() 或 create()),则返回 null。取dialog中某个按钮, whichButton 可选的值: DialogInterface.BUTTON_POSITIVEDialogInterface.BUTTON_NEGATIVEDialogInterface.BUTTON_NEUTRAL(这是最左侧的按钮)
open ListView! getListView() 获取对话框中使用的列表视图。
open Boolean onKeyDown(keyCode: Int, event: KeyEvent) 按下某个键
open Boolean onKeyUp(keyCode: Int, event: KeyEvent) 抬起某个键
open Unit setButton(whichButton: Int, text: CharSequence!, msg: Message!)设置按下按钮时要发送的消息。如果在 show() 之后调用此方法则无效。
open Unit setButton(whichButton: Int, text: CharSequence!, listener: OnClickListener!)设置在按下对话框的正按钮时要调用的侦听器。如果在 show() 之后调用此方法则无效。
open Unit setButton(whichButton: Int, text: CharSequence!, icon: Drawable!, listener: OnClickListener!)设置要与按钮文本一起显示的图标以及在按下对话框的正按钮时要调用的侦听器。如果在 show() 之后调用此方法则无效。
open Unit setCustomTitle(customTitleView: View!)设置自定义的title 如果在 show() 之后调用此方法则无效。
open Unit setIcon(resId: Int) 设置icon,如果不想要icon将resId设置为0
open Unit setIcon(icon: Drawable!) 设置要在标题中使用的 Drawable。
open Unit setIconAttribute(attrId: Int)设置由主题属性提供的图标。例如android.R.attr.alertDialogIcon
open Unit setMessage(message: CharSequence!)设置要显示的消息。
open Unit setTitle(title: CharSequence?) 设置标题
open Unit setView(view: View!)设置要在对话框中显示的视图。如果在 show() 之后调用此方法则无效。
open Unit setView(view: View!, viewSpacingLeft: Int, viewSpacingTop: Int, viewSpacingRight: Int, viewSpacingBottom: Int)设置要在对话框中显示的视图,指定在该视图周围显示的间距。如果在 show() 之后调用此方法则无效。
  1. AlertDialog的创建

AlertDialog的构造函数都是protected的,因此我们无法直接通过构造函数实例化,所以SDK提供了 AlertDialog.Builder这个内部类用来创建AlertDialog

构造方法
Builder(context: Context!) 为使用默认警报对话框主题的警报对话框创建构建器。 默认警报对话框主题由父上下文主题中的 R.attr.alertDialogTheme 定义。
Builder(context: Context!, themeResId: Int) 为使用显式主题资源的警报对话框创建构建器。 指定的主题资源 (themeResId) 应用于父上下文的主题之上。它可以指定为包含完全填充主题的样式资源,例如 R.style.Theme_Material_Dialog,以替换父上下文主题中的所有属性,包括主色和强调色。 为了保留诸如主色和强调色之类的属性,themeResId 可以改为指定为覆盖主题,例如 R.style.ThemeOverlay_Material_Dialog。这将仅覆盖将警报窗口样式化为对话框所需的窗口属性。 或者,可以将 themeResId 指定为 0 以使用 R.attr.alertDialogTheme 的父上下文解析值。
返回值 方法名
open AlertDialog! create()使用提供给此构建器的参数创建 AlertDialog。 调用此方法不会显示对话框。如果不需要额外的处理,可以调用 show() 来创建和显示对话框。
open Context! getContext()为由此生成器创建的对话框返回具有适当主题的上下文。应用程序应该使用这个 Context 来获取 LayoutInflaters 来膨胀将在结果对话框中使用的视图,因为它会导致视图用正确的主题膨胀。
open AlertDialog.Builder! setAdapter(adapter: ListAdapter!, listener: DialogInterface.OnClickListener!)设置由给定 ListAdapter 提供的项目列表作为内容显示在对话框中,您将通过提供的侦听器收到所选项目的通知。
open AlertDialog.Builder! setCancelable(cancelable: Boolean)设置对话框是否可取消。默认为true。
open AlertDialog.Builder! setCursor(cursor: Cursor!, listener: DialogInterface.OnClickListener!, labelColumn: String!)设置由给定 Cursor 提供的项目列表,作为内容显示在对话框中,您将通过提供的侦听器收到所选项目的通知。
open AlertDialog.Builder! setCustomTitle(customTitleView: View!)使用自定义视图 customTitleView 设置标题。 方法 setTitle(int) 和 setIcon(int) 应该足以满足大多数标题,但如果标题需要更多自定义,则提供此方法。使用这将替换通过其他方法设置的标题和图标。 注意:为了确保样式一致,自定义视图应该使用通过 getContext() 获得的警报对话框的主题上下文来膨胀或构造。
open AlertDialog.Builder! setIcon(iconId: Int)设置要在标题中使用的 Drawable 的资源 ID。 优先于使用 setIcon(android.graphics.drawable.Drawable) 设置的值
open AlertDialog.Builder! setIcon(icon: Drawable!)设置要在标题中使用的 Drawable。 注意:为确保样式一致,应使用通过 getContext() 获取的警报对话框的主题上下文来扩充或构造可绘制对象。
open AlertDialog.Builder! setIconAttribute(attrId: Int)设置由主题属性提供的图标。例如android.R.attr#alertDialogIcon。 优先于使用 setIcon(int) 或 setIcon(android.graphics.drawable.Drawable) 设置的值
open AlertDialog.Builder! setInverseBackgroundForced(useInverseBackground: Boolean)将警报对话框设置为使用反向背景,无论内容是什么。(已弃用:此标志仅用于之前的 Material主题。相反,使用警报对话框主题指定窗口背景。)
open AlertDialog.Builder! setItems(itemsId: Int, listener: DialogInterface.OnClickListener!)设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。这应该是一个数组类型,即 R.array.foo
open AlertDialog.Builder! setItems(items: Array<CharSequence!>!, listener: DialogInterface.OnClickListener!)设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。
open AlertDialog.Builder! setMessage(messageId: Int) 使用给定的资源 ID 设置要显示的消息。
open AlertDialog.Builder! setMessage(message: CharSequence!)设置要显示的消息。
open AlertDialog.Builder! setMultiChoiceItems(itemsId: Int, checkedItems: BooleanArray!, listener: DialogInterface.OnMultiChoiceClickListener!)设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。这应该是一个数组类型,例如R.array.foo。该列表将在每个选中项目的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。
open AlertDialog.Builder! setMultiChoiceItems(items: Array<CharSequence!>!, checkedItems: BooleanArray!, listener: DialogInterface.OnMultiChoiceClickListener!)设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。该列表将在每个选中项目的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。
open AlertDialog.Builder! setMultiChoiceItems(cursor: Cursor!, isCheckedColumn: String!, labelColumn: String!, listener: DialogInterface.OnMultiChoiceClickListener!)设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。该列表将在每个选中项目的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。
open AlertDialog.Builder! setNegativeButton(textId: Int, listener: DialogInterface.OnClickListener!)设置在按下对话框的Negative按钮时要调用的侦听器。
open AlertDialog.Builder! setNegativeButton(text: CharSequence!, listener: DialogInterface.OnClickListener!)设置在按下对话框的Negative按钮时要调用的侦听器。
open AlertDialog.Builder! setNeutralButton(textId: Int, listener: DialogInterface.OnClickListener!)设置在按下对话框的Neutral按钮时要调用的侦听器。
open AlertDialog.Builder! setNeutralButton(text: CharSequence!, listener: DialogInterface.OnClickListener!)设置在按下对话框的Neutral按钮时要调用的侦听器。
open AlertDialog.Builder! setOnCancelListener(onCancelListener: DialogInterface.OnCancelListener!)设置在对话框取消时将调用的回调。 即使在可取消的对话框中,对话框也可能由于被取消或提供的选项之一被选择以外的原因而被关闭。如果您有兴趣侦听对话框被关闭的所有情况,而不仅仅是在取消时,请参阅 setOnDismissListener
open AlertDialog.Builder! setOnDismissListener(onDismissListener: DialogInterface.OnDismissListener!)设置在对话框因任何原因关闭时将调用的回调。
open AlertDialog.Builder! setOnItemSelectedListener(listener: AdapterView.OnItemSelectedListener!)设置在选择列表中的项目时要调用的侦听器。
open AlertDialog.Builder! setOnKeyListener(onKeyListener: DialogInterface.OnKeyListener!)设置将在将key分派到对话框时调用的回调。
open AlertDialog.Builder! setPositiveButton(textId: Int, listener: DialogInterface.OnClickListener!)设置在按下对话框的Positive按钮时要调用的侦听器。
open AlertDialog.Builder! setPositiveButton(text: CharSequence!, listener: DialogInterface.OnClickListener!)设置在按下对话框的Positive按钮时要调用的侦听器。
open AlertDialog.Builder! setSingleChoiceItems(itemsId: Int, checkedItem: Int, listener: DialogInterface.OnClickListener!)设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。这应该是一个数组类型,即 R.array.foo 该列表将在选中项的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。
open AlertDialog.Builder! setSingleChoiceItems(cursor: Cursor!, checkedItem: Int, labelColumn: String!, listener: DialogInterface.OnClickListener!)设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。该列表将在选中项目的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。
open AlertDialog.Builder! setSingleChoiceItems(items: Array<CharSequence!>!, checkedItem: Int, listener: DialogInterface.OnClickListener!)设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。该列表将在选中项目的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。
open AlertDialog.Builder! setSingleChoiceItems(adapter: ListAdapter!, checkedItem: Int, listener: DialogInterface.OnClickListener!)设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。该列表将在选中项目的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。.
open AlertDialog.Builder! setTitle(titleId: Int)使用给定的资源 ID 设置标题。
open AlertDialog.Builder! setTitle(title: CharSequence!)设置对话框中显示的标题。
open AlertDialog.Builder! setView(layoutResId: Int)将自定义视图资源设置为对话框的内容。资源将被膨胀,将所有顶级视图添加到屏幕上。
open AlertDialog.Builder! setView(view: View!)将自定义视图设置为警报对话框的内容。 使用前 Holo 主题时,如果提供的视图是 ListView 的实例,则将使用浅色背景。 注意:为了确保样式一致,自定义视图应该使用通过 getContext() 获得的警报对话框的主题上下文来膨胀或构造。
open AlertDialog! show()使用提供给此构建器的参数创建 AlertDialog 并立即显示对话框。
//Theme.AppCompat.Dialog主题常用的一般有以下属性:
<!-- 背景透明 -->  
<item name="android:windowBackground">@android:color/transparent</item>  
<!-- 边框 -->  
<item name="android:windowFrame">@null</item>  
<!-- 是否浮现在activity之上 -->  
<item name="android:windowIsFloating">true</item>  
<!-- 是否半透明 -->  
<item name="android:windowIsTranslucent">true</item>  
<!-- 是否无标题 -->  
<item name="android:windowNoTitle">true</item>  
<!-- Dialog背景样式 --> 
<item name="android:background">@android:color/transparent</item>  
<!-- 模糊 -->  
<item name="android:backgroundDimEnabled">true</item>  
<!-- 遮罩层 -->  
<item name="android:backgroundDimAmount">0.5</item> 
<!-- Dialog的宽度和屏幕的比例 -->  
<item name="android:windowMinWidthMinor">80%</item>
<!-- Dialog的最小宽度 -->  
<item name="android:minWidth">300dp</item>
<!-- Dialog的最小高度 -->  
<item name="android:minHeight">200dp</item>

AlertDialog 的使用

1.提示对话框

val builder = AlertDialog.Builder(this)
builder.setTitle("Title")
builder.setMessage("Message")
//设置Neutral按钮(最左边的按钮)
builder.setNeutralButton("Neutral") { _, _ ->
    Toast.makeText(
        this@MainActivity,
        "点击了Neutral",
        Toast.LENGTH_SHORT
    ).show()
}
//设置Positive按钮
builder.setPositiveButton("Positive") { _, _ ->
    Toast.makeText(
        this@MainActivity,
        "点击了Positive",
        Toast.LENGTH_SHORT
    ).show()
}
//设置Negative按钮
builder.setNegativeButton("Negative") { _, _ ->
    Toast.makeText(
        this@MainActivity,
        "点击了Negative",
        Toast.LENGTH_SHORT
    ).show()
}
//设置在对话框因任何原因关闭时将调用的回调。
builder.setOnDismissListener {
    Toast.makeText(
        this@MainActivity,
        "对话框Dismiss了",
        Toast.LENGTH_SHORT
    ).show()
}
//设置在对话框取消时将调用的回调
//        builder.setOnCancelListener {
//            Toast.makeText(
//                this@MainActivity,
//                "对话框Cancel了",
//                Toast.LENGTH_SHORT
//            ).show()
//        }
//点击对话框以外的区域是否让对话框消失,默认为true;
builder.setCancelable(false)

//设置对话框的title左边的图标;
builder.setIcon(resources.getDrawable(R.drawable.ic_launcher_background,null))

val dialog = builder.create()
//这个是Dialog中的方法,builder中没有这个方法
dialog.setOnShowListener {
    Toast.makeText(
        this@MainActivity,
        "对话框Show了",
        Toast.LENGTH_SHORT
    ).show()
}
dialog.show()
截屏2021-09-01 上午9.44.28.png
  1. 列表对话框

    val builder = AlertDialog.Builder(this)
    builder.setCancelable(false)
    builder.setTitle("这是ListDialog")
    builder.setIcon(R.mipmap.ic_launcher)
    builder.setNegativeButton("取消") { _, _ ->
      Toast.makeText(
          this@MainActivity,
          "点击取消",
          Toast.LENGTH_SHORT
      ).show()
    }
    
    builder.setPositiveButton("确定") { _, _ ->
      Toast.makeText(
          this@MainActivity,
          "点击确定",
          Toast.LENGTH_SHORT
      ).show()
    }
    val list = arrayOf("语文", "数学", "英语", "化学", "生物", "物理", "体育")
    //设置列表
    builder.setItems(list) { p0, p1 ->
      Toast.makeText(
          this@MainActivity,
          "点击了第${p1}行",
          Toast.LENGTH_SHORT
      ).show()
    }
    builder.create().show()
    
截屏2021-09-01 上午10.12.04.png
  1. 单选对话框

    val builder = AlertDialog.Builder(this)
    builder.setCancelable(false)
    builder.setTitle("这是ListDialog")
    builder.setIcon(R.mipmap.ic_launcher)
    builder.setNegativeButton("取消") { _, _ ->
        Toast.makeText(
            this@MainActivity,
            "点击取消",
            Toast.LENGTH_SHORT
        ).show()
    }
    
    builder.setPositiveButton("确定") { _, _ ->
        Toast.makeText(
            this@MainActivity,
            "点击确定",
            Toast.LENGTH_SHORT
        ).show()
    }
    val list = arrayOf("语文", "数学", "英语", "化学", "生物", "物理", "体育")
    //设置列表
    
    builder.setSingleChoiceItems(list,3) { p0, p1 ->
        Toast.makeText(
            this@MainActivity,
            "点击了第${p1}行",
            Toast.LENGTH_SHORT
        ).show()
    }
    builder.create().show()
    
截屏2021-09-01 上午10.15.53.png
  1. 多选对话框

    val builder = AlertDialog.Builder(this)
            builder.setCancelable(false)
            builder.setTitle("这是ListDialog")
            builder.setIcon(R.mipmap.ic_launcher)
            builder.setNegativeButton("取消") { _, _ ->
                Toast.makeText(
                    this@MainActivity,
                    "点击取消",
                    Toast.LENGTH_SHORT
                ).show()
            }
    
            builder.setPositiveButton("确定") { _, _ ->
                Toast.makeText(
                    this@MainActivity,
                    "点击确定",
                    Toast.LENGTH_SHORT
                ).show()
            }
            val list = arrayOf("语文", "数学", "英语", "化学", "生物", "物理", "体育")
            var checked = booleanArrayOf(false,false,true,false,false,true,false)
            //设置列表
            builder.setMultiChoiceItems(list,checked
            ) { _, p1, p2 ->
                Toast.makeText(
                    this@MainActivity,
                    "点击了第${p1}行 $p2",
                    Toast.LENGTH_SHORT
                ).show()
            }
            builder.create().show()
    
截屏2021-09-01 上午10.29.13.png
  1. 自定义弹窗

     val builder = AlertDialog.Builder(this, R.style.CustomDialog)
         builder.setCancelable(true)
         val view = layoutInflater.inflate(R.layout.custom_layout, null, false)
         val binding = CustomLayoutBinding.bind(view)
    
         builder.setView(view)
         val dialog =  builder.create()
         dialog.show()
    
         binding.cancelButton.setOnClickListener {
             Toast.makeText(
                 this@MainActivity,
                 "点击了取消",
                 Toast.LENGTH_SHORT
             ).show()
             dialog.dismiss()
         }
         binding.okButton.setOnClickListener {
             Toast.makeText(
                 this@MainActivity,
                 "点击了确认",
                 Toast.LENGTH_SHORT
             ).show()
         }
    

    custom_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
    
        <Button
            android:id="@+id/cancel_button"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:layout_marginLeft="40dp"
            android:backgroundTint="#f00"
            android:text="取消"
            android:textColor="#0f0"
            android:textSize="20sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    
        <Button
            android:id="@+id/ok_button"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:layout_marginRight="40dp"
            android:backgroundTint="#0f0"
            android:text="确定"
            android:textColor="#f00"
            android:textSize="20sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent" />
    
        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="80dp"
            android:layout_marginTop="60dp"
            android:gravity="center"
            android:text="Message"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@id/title"
            app:layout_constraintBottom_toTopOf="@id/cancel_button"
            />
    
        <TextView
            android:id="@+id/title"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_marginLeft="30dp"
            android:layout_marginRight="30dp"
            android:gravity="center"
            android:text="标题"
            app:layout_constraintBottom_toTopOf="@id/message"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    
    截屏2021-09-01 下午12.09.12.png

    如何修改Dialog的宽度和高度

    直接在layout.xml修改layout_width和layout_height是无法修改Dialog的宽和高的需要自定义一个theme,使用这个theme创建AlertDialog.

      <style name="CustomDialog" parent="Theme.AppCompat.Dialog">
            <!-- dialog  宽度与屏幕比例-->
            <!--        <item name="android:windowMinWidthMinor">80%</item>-->
            <!--设置最小宽度-->
            <item name="android:minWidth">300dp</item>
            <!--设置最小高度-->
            <item name="android:minHeight">200dp</item>
        </style>
    

    通过代码修改AlertDialog的大小

    //这段代码必须放在show()方法之后,否则没有作用
    dialog.window?.setLayout(100,200)
    

    如何修改AlertDialog的位置

    //这段代码必须放在show()方法之前,否则没有作用 当x,y都为0则居中显示
    val para = dialog.window?.attributes
    para?.x = 100 
    para?.y = 100
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容