android如何在snackBar上显示进度对话框?

Sac*_*are 6 progressdialog android-asynctask snackbar

有没有办法在snackBar上显示进度对话框,同时从服务器获取AsyncTask内的分页数据.如果可能,那么如何做到这一点.请给出建议.

小智 10

对于新设计库:

如果你想在左侧显示progressBar:

 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();
Run Code Online (Sandbox Code Playgroud)

或在右侧:

 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();
Run Code Online (Sandbox Code Playgroud)

  • 它是2018年,如果您使用的是Google的新材料设计,则ID应该为“ com.google.android.material.R.id.snackbar_text” (5认同)

kas*_*len 8

最简单和最好的方法是:

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

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"));
Run Code Online (Sandbox Code Playgroud)

  • 不确定API中是否有更改但bar.getView返回一个View对象,因为您知道无法将子项添加到视图中. (2认同)
  • Alberto M是的,Api已被改变,现在你只需将其投射到SnackbarLayout.其他一切都是一样的. (2认同)

Con*_*ody 1

我认为您可以将自定义进度对话框设置为看起来像 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"
/>
Run Code Online (Sandbox Code Playgroud)

创建另一个动画资源文件,将其命名为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" />
Run Code Online (Sandbox Code Playgroud)

现在将流程对话框样式放置在样式 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>
Run Code Online (Sandbox Code Playgroud)

将其放置为动画:

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_in</item>
    <item name="android:windowExitAnimation">@anim/slide_out</item>
</style>
Run Code Online (Sandbox Code Playgroud)

现在添加您的方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

方法信用返回@mike-m参考是否可以改变进度对话框的消息或微调器位置?

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

士力架酒吧