【问题标题】:ProgressDialog is deprecated.What is the alternate one to use?ProgressDialog 已弃用。要使用的替代项是什么?
【发布时间】:2018-01-04 11:52:24
【问题描述】:

我发现ProgressDialog 现在已被弃用。除了ProgressBar,还有什么可以替代它。 我正在使用 android studio 2.3.3 版。

ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();

【问题讨论】:

标签: android progressdialog android-progressbar


【解决方案1】:

是的,在 API level 26 中已弃用。相反,您可以使用progressBar

以编程方式创建它:

首先获取对根布局的引用

RelativeLayout layout = findViewById(R.id.display);  //specify here Root layout Id

RelativeLayout layout = findViewById(this);

然后添加进度条

progressBar = new ProgressBar(youractivity.this, null, android.R.attr.progressBarStyleLarge);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100, 100);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.addView(progressBar, params);

显示进度条

progressBar.setVisibility(View.VISIBLE);

隐藏进度条

progressBar.setVisibility(View.GONE);

要禁用用户交互,您只需添加以下内容 代码

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                           WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

要恢复用户交互,您只需添加以下代码

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

仅供参考,请将android.R.attr.progressBarStyleSmall 更改为android.R.attr.progressBarStyleHorizontal

下面的代码只适用于API level 21以上

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

通过 xml 创建:

<ProgressBar
        android:id="@+id/progressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:max="100"
        android:backgroundTint="@color/white"
        android:layout_below="@+id/framelauout"
        android:indeterminateTint="#1a09d6"
        android:layout_marginTop="-7dp"/>

在你的活动中

progressBar = (ProgressBar) findViewById(R.id.progressbar);

显示/隐藏进度条是一样的

 progressBar.setVisibility(View.VISIBLE); // To show the ProgressBar 
 progressBar.setVisibility(View.INVISIBLE); // To hide the ProgressBar

这是它的外观示例图片:

更多详情:
1. Reference one
2. Reference Two

【讨论】:

  • 这就像你一直在使用它,你就像是的,最后进度对话框被弃用了,所以我可以向世界展示我的潜力:D,开个玩笑,非常感谢你的详细回答。跨度>
  • 但是如何设置消息()呢?
  • @David 事情是,阻止 UI 正是我想要做的,因为我不希望用户能够在后台任务完成之前进行交互。
  • @David 所以你是说谷歌提倡用户应该能够在后台线程准备应用程序数据时打开空下拉菜单、查看占位符项目并按下按钮?这设计太可怕了!应该显示一个“请稍候”对话框,最好是动画以显示应用程序没有停止,然后在应用程序准备好后允许用户与 UI 进行交互。但是,如果您的意思是“不要在 UI 线程上做繁重的事情”,那么这是有道理的。当我说“阻塞 UI”时,我的意思是阻止用户进行交互,而不是在 UI 线程上工作。
  • 那么,现在我需要一行代码,结果大致相同?谷歌干得好!
【解决方案2】:

您可以将AlertDialog 用作ProgressDialog,请参阅下面的ProgressDialog 代码。每次显示进度对话框时都需要调用此函数。

代码:

    public void setProgressDialog() {

    int llPadding = 30;
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.HORIZONTAL);
    ll.setPadding(llPadding, llPadding, llPadding, llPadding);
    ll.setGravity(Gravity.CENTER);
    LinearLayout.LayoutParams llParam = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    ll.setLayoutParams(llParam);

    ProgressBar progressBar = new ProgressBar(this);
    progressBar.setIndeterminate(true);
    progressBar.setPadding(0, 0, llPadding, 0);
    progressBar.setLayoutParams(llParam);

    llParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    TextView tvText = new TextView(this);
    tvText.setText("Loading ...");
    tvText.setTextColor(Color.parseColor("#000000"));
    tvText.setTextSize(20);
    tvText.setLayoutParams(llParam);

    ll.addView(progressBar);
    ll.addView(tvText);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setCancelable(true);
    builder.setView(ll);

    AlertDialog dialog = builder.create();
    dialog.show();
    Window window = dialog.getWindow();
    if (window != null) {
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
        layoutParams.copyFrom(dialog.getWindow().getAttributes());
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        dialog.getWindow().setAttributes(layoutParams);
    }
}

输出:

【讨论】:

  • 如何解除?
  • 创建一个像 BaseActivity 这样的基类,然后在添加这段代码后,还添加一个方法关闭对话框,但为此,您需要全局定义“AlertDialog 对话框”对象
  • 然后只需在隐藏对话框方法中调用 dialog.dismiss() 方法。
  • 一切都很好,但是点击屏幕对话框上的任何地方都会被关闭。服务调用正在进行中,suer 能够关闭它并使用不好的用户界面。任何解决方案?
  • @FaisalQayyum 使 AlertDialog 对话框实例全局化并用于关闭。
【解决方案3】:

您可以简单地为进度条设计一个 xml 界面,并将其作为视图传递给 AlertDialog,然后随时显示或关闭对话框。

progress.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:padding="13dp"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ProgressBar
        android:id="@+id/loader"
        android:layout_marginEnd="5dp"
        android:layout_width="45dp"
        android:layout_height="45dp" />
    <TextView
        android:layout_width="wrap_content"
        android:text="Loading..."
        android:textAppearance="?android:textAppearanceSmall"
        android:layout_gravity="center_vertical"
        android:id="@+id/loading_msg"
        android:layout_toEndOf="@+id/loader"
        android:layout_height="wrap_content" />

</LinearLayout>

显示进度对话框的代码。只需复制此代码并将其粘贴到您的片段中即可。

Dialog dialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(R.layout.progress);
        // This should be called once in your Fragment's onViewCreated() or in Activity onCreate() method to avoid dialog duplicates.
        dialog = builder.create();
    }
    
//   This method is used to control the progress dialog.
      private void setDialog(boolean show){
               if (show)dialog.show();
                    else dialog.dismiss();
           }

然后,只要您想显示进度对话框,只需调用该方法,并将 true 作为参数传递以显示它或传递 false 以关闭对话框。

【讨论】:

  • @Alok Rajasukumaran 看来您正在使用活动,只需将其替换为 this ,使其看起来像这样 AlertDialog.Builder builder = new AlertDialog.Builder(this); 。请确保您正在复制正确的代码。跨度>
  • layout_toEndOf 可以被删除,因为LinearLayout 不是
  • 我一直在尝试通过更改对话框显示进度条,但我遇到了一些问题,您可以查看我的question吗?
  • 当我调用 setDialog(false) 时,对话框不会消失。只有当我触摸屏幕时它才会消失
  • 我知道现在帮助@Darksymphony 为时已晚,但 setDialog 不应该调用 builder.create()。这应该只发生一次,或者当调用代码想要第一次dismiss() 时将创建第二个对话框。因此,第一个仍然显示...
【解决方案4】:

此类在 API 级别 26 中已弃用。ProgressDialog 是一种模式 对话框,它会阻止用户与应用程序交互。反而 使用此类,您应该使用进度指示器,例如 ProgressBar,可以嵌入到应用程序的 UI 中。或者, 您可以使用通知来通知用户任务的进度。 link

由于 Google 新的 UI 标准,它已在 Android O 弃用

【讨论】:

  • "This class was deprecated in API level 26" 用于代替日期。他们不想让你再使用它。是的,这是因为新的 UI 标准,但它们适用于每个 API 级别...
  • “由于 Google 新的 UI 标准,它在 Android O 已被弃用” - 请链接新的 UI 标准
  • 而弃用它的原因是因为它阻止了用户输入?有时候我在想,谷歌工程师在喷什么粉。使用阻塞对话框比隐藏/禁用输入控件然后启用进度条要容易得多。 Google 的想法很愚蠢。
  • 我猜他们对防止滥用模式对话框更感兴趣:有时在用户不需要等待的情况下,它们会显示让用户等待操作结束全部,但可以继续做其他事情,所以让他们不必要地等待会降低用户体验。尽管如此,在很多情况下用户别无选择,只能等待操作完成,所以我同意应该为这些情况提供一种不被弃用的标准方法,而不是强迫每个开发人员实施自己的方法。跨度>
  • @David 看看对我的评论的支持。也告诉那些人。我认为谷歌的决定更具政治性。而且我还在使用对话框。所以,开你和谷歌的玩笑。
【解决方案5】:

ProgressBar 非常简单易用, 我打算使这与简单的进度对话框相同。 第一步是您可以为要显示的对话框制作 xml 布局,假设我们将此布局命名为

layout_loading_dialog.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="20dp">
    <ProgressBar
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:gravity="center"
        android:text="Please wait! This may take a moment." />
</LinearLayout>

下一步是创建 AlertDialog,它将显示带有 ProgressBar 的布局

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(false); // if you want user to wait for some process to finish,
builder.setView(R.layout.layout_loading_dialog);
AlertDialog dialog = builder.create();

现在剩下的就是在我们的点击事件中显示和隐藏这个对话框 像这样

dialog.show(); // to show this dialog
dialog.dismiss(); // to hide this dialog

就是这样,它应该可以工作,正如您所见,实现 ProgressBar 而不是 ProgressDialog 非常简单易行。 现在您可以在 Handler 或 ASyncTask 中显示/关闭此对话框,这取决于您的需要

【讨论】:

  • 请将progress_dialog.show(); 更改为builder.show();。谢谢。
  • 我已将名称更改为正确的 AlertDialog 对象,show() / dismiss(),但我没有输入 builder.show(),因为要关闭它,我们将不得不这样做 dialog.dismiss()对于喜欢保持代码简单易懂的人来说有点困惑,而且因为builder.show()返回AlertDialog对象,我们必须像AlertDialog dialog = builder.show();一样保存那个引用,然后做dialog.dismiss(),它更容易让builder.create() 返回一些AlertDialog 对象,然后使用该对象显示和隐藏对话框
  • 如果调用线程不是主 UI 线程,我们可以使用“runOnUiThread(new Runnable() { @Override public void run() { dialog.show/dismiss(); } });” . (当我们使用从 WebView 调用时很有用 - shouldoverride 方法。)
  • 我一直在尝试通过更改对话框显示进度条,但我遇到了一些问题,您可以查看我的question吗?
【解决方案6】:

是的,ProgressDialog 已被弃用,但 Dialog 不是。

您可以将自己的 XML 文件(包含进度条和加载文本)添加到对话框对象中,然后使用 show()dismiss() 函数显示或隐藏它。 这是一个示例(Kotlin):

ProgressDialog 类

class ProgressDialog {
companion object {
    fun progressDialog(context: Context): Dialog{
        val dialog = Dialog(context)
        val inflate = LayoutInflater.from(context).inflate(R.layout.progress_dialog, null)
        dialog.setContentView(inflate)
        dialog.setCancelable(false)
        dialog.window!!.setBackgroundDrawable(
                ColorDrawable(Color.TRANSPARENT))
        return dialog
    }
  }
}

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:background="#fff"
android:padding="13dp"
android:layout_height="wrap_content">
<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyle"
    android:layout_width="100dp"
    android:layout_margin="7dp"
    android:layout_height="100dp"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_margin="7dp"
    android:layout_toEndOf="@+id/progressBar"
    android:text="Loading..." />
</RelativeLayout>

在您的代码中: 就做var dialog = ProgressDialog.progressDialog(context)

显示:dialog.show()

隐藏:dialog.dismiss()

【讨论】:

  • 很好的解决方案!刚刚在下面发布了 ProgressDialog 类的替代版本。
【解决方案7】:

好吧,如果你真的想违背他们的意愿,你仍然可以使用Sweet Alert Dialog 或自己创建一个。

progress_dialog_layout

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

    <TableRow
        android:layout_centerInParent="true"
        android:layout_width="match_parent"
        android:layout_height="64dp" >

        <ProgressBar
            android:id="@+id/progressBar2"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />

        <TextView
            android:gravity="center|left"
            android:id="@+id/textView9"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textColor="@color/black"
            android:textSize="18sp"
            android:text="Downloading data. Please wait.." />
    </TableRow>
</RelativeLayout>

Java 代码:

AlertDialog b;
AlertDialog.Builder dialogBuilder;

public void ShowProgressDialog() {
dialogBuilder = new AlertDialog.Builder(DataDownloadActivity.this);
LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            View dialogView = inflater.inflate(R.layout.progress_dialog_layout, null);
            dialogBuilder.setView(dialogView);
            dialogBuilder.setCancelable(false);
            b = dialogBuilder.create();
            b.show();
        }

        public void HideProgressDialog(){

            b.dismiss();
        }

【讨论】:

  • 我在生产环境中使用 SweetAlertDialog 时有过糟糕的经历,当它从一个窗口泄漏到另一个窗口时要非常小心。
  • 对我来说 HideProgress 什么都不做。
  • 为什么使用库只是为了显示进度对话框?
  • 注意,这里TableRow 与使用水平LinearLayout 相同,因为父级不是TableLayout developer.android.com/reference/android/widget/TableRow
【解决方案8】:

您不需要导入任何自定义库。

我更喜欢使用现代的AlertDialog,所以这是Kishan Donga 在此页面中发布的出色答案的Kotlin 版本。

Kotlin 代码:

fun setProgressDialog(context:Context, message:String):AlertDialog {
    val llPadding = 30
    val ll = LinearLayout(context)
    ll.orientation = LinearLayout.HORIZONTAL
    ll.setPadding(llPadding, llPadding, llPadding, llPadding)
    ll.gravity = Gravity.CENTER
    var llParam = LinearLayout.LayoutParams(
                  LinearLayout.LayoutParams.WRAP_CONTENT,
                  LinearLayout.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    ll.layoutParams = llParam

    val progressBar = ProgressBar(context)
    progressBar.isIndeterminate = true
    progressBar.setPadding(0, 0, llPadding, 0)
    progressBar.layoutParams = llParam

    llParam = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    val tvText = TextView(context)
    tvText.text = message
    tvText.setTextColor(Color.parseColor("#000000"))
    tvText.textSize = 20.toFloat()
    tvText.layoutParams = llParam

    ll.addView(progressBar)
    ll.addView(tvText)

    val builder = AlertDialog.Builder(context)
    builder.setCancelable(true)
    builder.setView(ll)

    val dialog = builder.create()
    val window = dialog.window
    if (window != null) {
        val layoutParams = WindowManager.LayoutParams()
        layoutParams.copyFrom(dialog.window?.attributes)
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT
                dialog.window?.attributes = layoutParams
    }
    return dialog
}

用法:

val dialog = setProgressDialog(this, "Loading..")
dialog.show()

输出:

【讨论】:

  • 如何在片段中使用?片段中的上下文是什么?
  • 通常在你的片段中你可以得到你当前的视图,所以上下文应该是:view!!.context
【解决方案9】:

ProgressBar 是 ProgressDialog 的最佳替代品。 指示操作进度的用户界面元素。

有关详细信息,请参阅此 Google 文档: https://developer.android.com/reference/android/widget/ProgressBar.html

【讨论】:

  • 他说“除了进度条”。
【解决方案10】:

正如documentation page 中提到的,替代 ProgressBar。可以通过将ProgressBar 放入AlertDialog 来复制ProgressDialog 的外观。

您仍然可以使用它,但 Android 不希望您使用它,这就是它被弃用的原因。所以你应该考虑用另一种方式解决你的问题,比如将ProgressBar嵌入到你的Layout中。

【讨论】:

  • @PeterHaddad 它在我的项目中的 api 28 中“正常”工作,与较低的 api 中相同。正如弃用所暗示的那样,它不再受支持,将来可能无法使用。
【解决方案11】:

ProgressDialog 在 API 级别 26 中已弃用。

"Deprecated" 是指正在被新功能或元素替换的功能或元素。

ProgressDialog 是一个模态对话框,它阻止用户与 应用程序。而不是使用此类,您应该使用进度 ProgressBar 之类的指示器,可以嵌入到您的应用程序的 用户界面。

优势

我个人认为 ProgressBar 比这两个更有优势。ProgressBar 是指示操作进度的用户界面元素。以非中断方式向用户显示进度条。在应用的用户界面中显示进度条。

【讨论】:

    【解决方案12】:

    也许这个guide 可以帮助你。

    通常我更喜欢使用指标制作自定义 AlertDialogs。解决了 App 视图自定义等问题。

    【讨论】:

      【解决方案13】:

      它可能对其他人有所帮助。

      许多流行的应用程序都有不同的方法来显示网络请求、文件加载等的进度。加载微调器不会显示已加载或剩余要加载的内容量。从 UI/UX 的角度来看,有一段时间的不确定性是不好的。许多流行的应用程序(Facebook、Linkedin 等)通过首先显示基本的 UI 显示解决了这个问题。然后加载的内容逐渐填充到屏幕上。

      我已在我的应用程序中使用 shimmer 来解决此问题。

      有一个很好的article 对此将对其他人有益

      【讨论】:

        【解决方案14】:

        我使用来自 https://github.com/Q115/DelayedProgressDialog 的 DelayedProgressDialog,它与 ProgressDialog 的作用相同,但在必要时还可以延迟。

        使用类似于Android O之前的ProgressDialog:

        DelayedProgressDialog progressDialog = new DelayedProgressDialog();
        progressDialog.show(getSupportFragmentManager(), "tag");
        

        【讨论】:

          【解决方案15】:

          你可以使用我写的这个class。它只提供基本的 职能。如果您想要一个功能齐全的 ProgressDialog,请使用 这个轻量级的library

          Gradle 设置

          在module/build.gradle中添加如下依赖:

          compile 'com.lmntrx.android.library.livin.missme:missme:0.1.5'
          

          如何使用?

          用法与原ProgressDialog类似

          ProgressDialog progressDialog = new 
          progressDialog(YourActivity.this);
          progressDialog.setMessage("Please wait");
          progressDialog.setCancelable(false);
          progressDialog.show();
          progressDialog.dismiss();
          

          注意:您必须覆盖活动的onBackPressed()

          Java8 实现:

          @Override
          public void onBackPressed() {
              progressDialog.onBackPressed(
                      () -> {
                          super.onBackPressed();
                          return null;
                      }
              );
          }
          

          Kotlin 实现:

          override fun onBackPressed() {
             progressDialog.onBackPressed { super.onBackPressed() }
          }
          
          • 请参阅 Sample App 了解完整实施
          • 完整的文档可以在here找到

          【讨论】:

            【解决方案16】:

            使用这个简单的技巧

            //初始化

            val dialog : Dialog = Dialog(this)
            

            //设置布局

            dialog.setContentView(R.layout.view_loading)
            

            //显示对话框

            dialog.show()
            

            // 去除白色背景

            dialog.window.setbackgroundDrawable(ColorDrawable(0))
            

            【讨论】:

              【解决方案17】:

              在进度对话框中,用户不能做任何工作。在进度对话框期间,所有后台进程都将停止。因此,建议用户使用进度条而不是进度对话框。

              【讨论】:

                【解决方案18】:

                这是我的不确定进度对话框版本:

                layout_loading_dialog.xml:

                <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    xmlns:tools="http://schemas.android.com/tools"
                    android:orientation="horizontal"
                    android:padding="20dp">
                
                    <ProgressBar
                        android:id="@+id/progressBar"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_marginEnd="10dp"
                        android:layout_marginRight="10dp"
                        android:layout_weight="1" />
                
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="4"
                        android:gravity="center"
                        android:textAlignment="textStart"
                        android:id="@+id/message"
                        tools:text="Please wait..." />
                </LinearLayout>
                

                IndeterminateProgressDialog.kt:

                class IndeterminateProgressDialog(context: Context) : AlertDialog(context) {
                    private val messageTextView: TextView
                
                    init {
                        val view = LayoutInflater.from(context).inflate(R.layout.layout_loading_dialog, null)
                        messageTextView = view.findViewById(R.id.message)
                        setView(view)
                    }
                
                    override fun setMessage(message: CharSequence?) {
                        this.messageTextView.text = message.toString()
                    }
                
                }
                

                用法:

                   val dialog = IndeterminateProgressDialog(context)
                                    dialog.setMessage("Please wait...")
                                    dialog.setCanceledOnTouchOutside(false)
                                    dialog.setCancelable(false)
                                    dialog.show()
                

                【讨论】:

                  【解决方案19】:

                  这是@Han 建议的我的ProgressDialog 类的kotlin 版本

                  class ProgressDialog(context: Context) : Dialog(context) {
                      init {
                          @SuppressLint("InflateParams")
                          val inflate = LayoutInflater.from(context).inflate(R.layout.dialog_progress, null)
                          setContentView(inflate)
                          setCancelable(false)
                          window!!.setBackgroundDrawable(
                              ColorDrawable(Color.TRANSPARENT)
                          )
                      }
                  }
                  

                  【讨论】:

                    【解决方案20】:

                    您可以通过使用库 wasabeef 来使用 SpotDialog,您可以从以下链接中找到完整的教程:

                    SpotsDialog Example in Android

                    【讨论】:

                      猜你喜欢
                      • 2016-05-25
                      • 2019-04-05
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-12-17
                      相关资源
                      最近更新 更多