【问题标题】:How to use ProgressBar instead of deprecated ProgressDialog in BaseActivity?如何在 BaseActivity 中使用 ProgressBar 而不是弃用的 ProgressDialog?
【发布时间】:2018-10-14 21:27:25
【问题描述】:

由于 ProgressDialog 在 API 级别 26 中已被弃用,我们如何使用 ProgressBar 代替?特别是,我们如何才能以一种可以在所有活动/片段之间共享的方式来做到这一点?

BaseActivity中ProgressDialog的使用示例:

public abstract class BaseActivity extends AppCompatActivity {

private ProgressDialog mProgressDialog;

@Override
public void showLoading() {
    //...
}

@Override
public void hideLoading() {
    //..
}

现在这是一个非常干净的解决方案,因为 ProgressDialog 不是小部件,并且不需要成为任何视图 xml 的一部分。由于 ProgressBar 必须在其中一个 xml 文件中声明,这里如何以与 ProgressDialog 相同的方式使用它?

我正在使用 NavigationDrawer 和对应的 Activity,并交换 Fragments 以提供内容。

【问题讨论】:

  • 您有 2 个选项,要么选择带有进度条的自定义对话框。或者只是将进度条直接集成到您的布局中。选择更适合您的用例的选项。
  • 这是一种模式弹出窗口的转变,它会在任务正在进行时挂起整个应用程序...... android 建议取消这种模式对话框 - 并且只显示一个简单的进度条,以便用户可以在后台服务运行时继续使用应用的其余部分。
  • 所以你的建议是将 ProgressBar 集成到 DrawerActivity 布局中?这是我的想法,但没有提供最佳解决方案,例如,如果我想添加一些其他活动,我不会像 BaseActivity 那样涵盖所有内容......我想我会使用自定义对话框,无论如何谢谢@萨加纳亚克

标签: android progressdialog android-progressbar


【解决方案1】:

活动

public abstract class BaseActivity extends AppCompatActivity {
    private ProgressBar progressBar;

    public void showLoading() {
        progressBar.setVisibility(View.Visible);
    }

    public void hideLoading() {
        progressBar.setVisibility(View.Gone);
    }
}

片段

((BaseActivity) getContext).showLoading();

现在这是一种简单且不安全的方法。

另一种方法是将其实施到您的活动中。在 xml 中放一个进度条。

public interface OnProgressChanged {
    void show();
    void hide();
}

然后在每个片段上

OnProgressChanged onProgressChangedListener;

@override
onAttach(Context context) {
    Activity activity = null;

    if (context instanceof Activity){
        activity = (Activity) context;
    }

    try {
        onProgressChangedListener = (OnProgressChanged) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement OnProgressChanged");
    } catch(NullPointerException e) {
        throw new ClassCastException("Error: onAttach(Context context) -> context not instance of Activity");
    }
}


// somewhere else in the code
onProgressChangedListener.show();

有很多方法可以做你想做的事。如果我是你,我会研究 MVP 模式。

【讨论】:

  • 您的意思是((BaseActivity) getActivity()).showLoading() 用于片段,而showLoading() 用于活动,但是如果getActivity() 返回null 怎么办? :)
  • 空检查一下,很明显?
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
相关资源
最近更新 更多