【问题标题】:Indeterminate ProgressBar while loading content for PreferenceFragment's ListPreference加载 PreferenceFragment 的 ListPreference 的内容时不确定 ProgressBar
【发布时间】:2014-08-27 01:39:50
【问题描述】:

在我的 PreferenceFragment 中有一个 ListPreference,它在 onCreate() 处以编程方式填充。因此,片段开始时会有一点延迟。为了避免这种情况,我想仅在按下首选项时填充 ListPreference,并在加载内容时放置一个不确定的 ProgressBar。

我该如何实现呢?我真的需要重写适配器吗?如何获取 ListPreference 的视图以传递给 View.OnClickListener?

我希望这不是一个微不足道的问题,我已经用谷歌搜索了一段时间,但我不明白我应该如何真正实现整个事情。

提前谢谢你。

【问题讨论】:

  • 我现在也面临着类似的情况。您找到问题的解决方案了吗?

标签: android optimization android-fragments android-preferences


【解决方案1】:

我为此创建了一个自定义PreferenceFragment

您可以扩展这个而不是 PreferenceFragment 并将您的呼叫延迟到 addPreferencesFromResource 直到完成所有加载,然后隐藏 ProgressBar 并显示您的内容。

public class ProgressBarPreferenceFragment extends PreferenceFragment {

    private FrameLayout progress;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = super.onCreateView(inflater, container, savedInstanceState);
        showLoading((ViewGroup) view);
        return view;
    }

    @Override
    public void addPreferencesFromIntent(Intent intent) {
        super.addPreferencesFromIntent(intent);

        hideLoading();
    }

    @Override
    public void addPreferencesFromResource(int preferencesResId) {
        super.addPreferencesFromResource(preferencesResId);

        hideLoading();
    }

    private void hideLoading() {
        ViewGroup root = (ViewGroup) getView();
        if ((root != null) && (progress != null)) {
            root.removeView(progress);
        }
    }

    private void showLoading(ViewGroup root) {
        progress = new FrameLayout(root.getContext());
        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.gravity = Gravity.CENTER;
        progress.addView(new ProgressBar(root.getContext()), lp);
        LayoutParams lp2 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        root.addView(progress, lp2);
    }
}

【讨论】:

    【解决方案2】:

    您可以使用AsyncTask 异步填充您的 ListPreference,然后在完成后移除不确定的进度条。

    首先,像这样扩展 AsyncTask:

    private class PopulateListPreferenceTask extends AsyncTask<CharSequence, Void, Void> {
     protected Long doInBackground(CharSequence... entries) {
         // Code to populate ListPreference in here
     }
    
     protected void onPostExecute() {
         // Add code here if necessary to retrieve the progress bar view, i.e. findViewById
         myIntederminateProgressBar.setVisibility(View.GONE);
     }
    

    }

    最初显示不确定的进度条。然后,在片段的 onActivityCreated 方法中,调用:

    new PopulateListPreferenceTask().execute(/*CharSequence entries go here*/);
    

    几个注意事项:

    • 我假设您希望提供Charsequences 作为 输入,但您可以使用任何其他类型。
    • 如果您需要 AsyncTask 来接收 Activity 上下文,您可以 重载构造函数以将其作为参数接收,然后 将其存储在字段中。

    【讨论】:

    • 非常感谢您的回复。我不明白如何使最初显示的不确定进度条。其次,我找不到 activityCreateView 方法的任何文档。
    • 编辑了我的回复(意思是 onActivityCreated 不是 activityCreateView)。您是通过编程方式还是在布局 XML 中创建进度条?
    • 我习惯于在 XML 中定义 UI 元素。我想创建一个新的 RelativeLayout 并将其绑定到 ListPreference 对话框内容占位符。对吗?
    • 我不知道您为什么在最初显示进度条时遇到问题。如果您将代码发布在您尝试显示它的位置,我可以提供反馈。
    • @EricaCooksey 在 PreferenceFragments 中您没有要膨胀的布局 xml,Android 会为您膨胀它,而是创建一个只有 pref 项目的首选项 xml,因此在常规活动中它有点棘手/片段。看我的回答
    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    相关资源
    最近更新 更多