【问题标题】:android how to show progress dialog on snackBar?android如何在snackBar上显示进度对话框?
【发布时间】:2016-05-21 20:41:29
【问题描述】:

在从服务器获取数据以在 AsyncTask 中进行分页时,是否可以在snackBar 上显示进度对话框。如果可能,那么如何做到这一点。请提供建议。

【问题讨论】:

标签: android-asynctask progressdialog snackbar


【解决方案1】:

对于新的设计库:

如果你想在左侧显示进度条:

 Snackbar bar = Snackbar.make(root, R.string.data_updating, Snackbar.LENGTH_INDEFINITE);
        ViewGroup contentLay = (ViewGroup) bar.getView().findViewById(android.support.design.R.id.snackbar_text).getParent();
        ProgressBar item = new ProgressBar(context);
        contentLay.addView(item,0);
        bar.show();

或在右侧:

 Snackbar bar = Snackbar.make(root, R.string.data_updating, Snackbar.LENGTH_INDEFINITE);
        ViewGroup contentLay = (ViewGroup) bar.getView().findViewById(android.support.design.R.id.snackbar_text).getParent();
        ProgressBar item = new ProgressBar(context);
        contentLay.addView(item);
        bar.show();

【讨论】:

  • 它是 2018 年,如果您使用的是 Google 的新材料设计,那么 id 应该是 com.google.android.material.R.id.snackbar_text
  • 致电getParent() 两次:bar.getView().findViewById(com.google.android.material.R.id.snackbar_text).getParent().getParent()
【解决方案2】:

最简单和最好的方法是这样的:

Snackbar bar = Snackbar.make(layout, "Somthing", Snackbar.LENGTH_INDEFINITE);
Snackbar.SnackbarLayout snack_view = bar.getView();
snack_view.addView(new ProgressBar(context));
bar.show();

SnackbarLayout extendsLinearLayout,因此您可以将视图添加为子视图或以您想要的方式对其进行自定义。

例如,要更改 SnackBar 中 TextView 的样式,您可以这样做:

TextView tv = (TextView) bar.getView().findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(Color.WHITE);
tv.setTextSize(0, dimen[1] / 40);
tv.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/font.otf"));

【讨论】:

  • 不确定 API 中是否发生了变化,但 bar.getView 返回了一个 View 对象,并且您知道您不能将子项添加到视图中。
  • Alberto 是的,Api 已更改,现在您只需将其转换为 SnackbarLayout。其他一切都一样。
【解决方案3】:

我已经编写了一个库来做到这一点。它还包括队列系统。试试看https://github.com/tingyik90/snackprogressbar

【讨论】:

    【解决方案4】:

    我认为您可以为自定义进度对话框设置样式,使其看起来像 Snackbar,因为在加载时,snackbar 不会阻止用户与 GUI 交互。

    更新:

    试试这个:

    创建动画资源文件,命名为 slide_in.xml 并粘贴:

    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="50%p" android:toYDelta="0%p"
    android:duration="@android:integer/config_longAnimTime"
    />
    

    创建另一个动画资源文件,命名为 slide_out.xml:

    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="100%p" />
    

    现在将进程对话框样式放入样式 res:

    <style name="CustomDialog" parent="@android:style/Theme.Holo.Dialog">
        <item name="android:windowMinWidthMajor">100%</item>
        <item name="android:windowMinWidthMinor">100%</item>
        <item name="android:background">#323232</item>
        <item name="android:textColor">#FFFFFF</item>
        <item name="android:windowBackground">@color/transparent</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:alertDialogStyle">@style/customDialogStyle</item>
        <item name="android:windowAnimationStyle">@style/DialogAnimation</item>
    
    </style>
    
    <style name="customDialogStyle">
        <item name="android:bottomBright">@android:color/transparent</item>
        <item name="android:bottomDark">@android:color/transparent</item>
        <item name="android:bottomMedium">@android:color/transparent</item>
        <item name="android:centerBright">@android:color/transparent</item>
        <item name="android:centerDark">@android:color/transparent</item>
        <item name="android:centerMedium">@android:color/transparent</item>
        <item name="android:fullBright">@android:color/transparent</item>
        <item name="android:fullDark">@android:color/transparent</item>
        <item name="android:topBright">@android:color/transparent</item>
        <item name="android:topDark">@android:color/transparent</item>
    

    将其用于动画:

    <style name="DialogAnimation">
        <item name="android:windowEnterAnimation">@anim/slide_in</item>
        <item name="android:windowExitAnimation">@anim/slide_out</item>
    </style>
    

    现在添加你的方法:

    public static ProgressDialog processSnackbar(Context context,String s){
        ProgressDialog pSnackbar = new ProgressDialog(context, R.style.CustomDialog) {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
    
                ProgressBar progress = (ProgressBar) findViewById(android.R.id.progress);
                LinearLayout bodyLayout = (LinearLayout) progress.getParent();
                TextView messageView = (TextView) bodyLayout.getChildAt(1);
    
                messageView.setPadding(20,0,0,0);
                LinearLayout.LayoutParams llp =
                        (LinearLayout.LayoutParams) messageView.getLayoutParams();
                llp.width = 0;
                llp.weight = 1;
    
    
                bodyLayout.removeAllViews();
                bodyLayout.addView(messageView, llp);
                bodyLayout.addView(progress);
            }
        };
        pSnackbar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pSnackbar.setMessage(s);
        pSnackbar.getWindow().setGravity(Gravity.BOTTOM);
        pSnackbar.setCancelable(false);
        return pSnackbar;
    }
    

    方法学分返回@mike-m 参考Is it possible to alter progress dialog's message or spinner position?

    我也在我的应用程序中使用它,看看:

    【讨论】:

      【解决方案5】:

      科特林 2021:

      fun showLoadingSnackbar(){
          val snackbar: Snackbar = Snackbar.make(findViewById(R.id.rootlayoutid), "TEXT or RES", Snackbar.LENGTH_INDEFINITE)
          val viewGroup = snackbar.view.findViewById<View>(com.google.android.material.R.id.snackbar_text).parent as ViewGroup
          viewGroup.addView(ProgressBar(this))// Or Context if not in Activity
          snackbar.show()
      }
      

      如果您想要它在左侧,只需拨打addView(ProgressBar(this),0),而不是像其他答案中提到的那样

      编辑:如果文本太长,答案会在顶部显示进度条,因此要使其居中,您可以这样做:

      val snackbar: Snackbar = Snackbar.make(this, text, duration)
          val viewGroup = snackbar.view.findViewById<View>(com.google.android.material.R.id.snackbar_text).parent as ViewGroup
          viewGroup.addView(ProgressBar(context).also {
              it.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
              it.foregroundGravity = Gravity.CENTER_VERTICAL
          })
      snackbar.show()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-16
        • 2020-11-03
        • 2016-03-17
        • 2012-06-11
        相关资源
        最近更新 更多