如何在Android中的PreferenceFragment中添加进度条?

时间:2016-07-05 02:22:12

标签: android android-progressbar preferencefragment

如何在PreferenceFragment中添加进度条?我有一些异步任务正在运行,它将在完成时显示我的偏好中的一些值。因此,在进行后台处理时,我计划在中心只显示一个进度条。任务完成后,我计划显示所有偏好。

这是我到目前为止所拥有的。

PreferenceFragment

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref_account);
    }

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    new AsyncTask<Void,Void,Void>() {

        String firstName, lastName, email;
        @Override
        protected void doInBackground() {
            // Doing something here to fetch values
        }

        @Override
        protected void onPostExecute() {
            findPreference("first_name").setSummary(firstName);
            findPreference("last_name").setSummary(lastName);
            findPreference("email").setSummary(email);
        }
    }
}

pref_account.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference android:key="first_name"
        android:title="@string/prompt_first_name"
        android:summary="" />

    <Preference android:key="last_name"
        android:title="@string/prompt_last_name"
        android:summary="" />

    <Preference android:key="email"
        android:title="@string/prompt_email"
        android:summary=""
        android:inputType="textEmailAddress" />

    <Preference android:key="sign_out"
        android:title="@string/action_sign_out" />

</PreferenceScreen>

我的问题是,因为这是一个PreferenceFragment而且我没有覆盖onCreateView上的方法,我应该在哪里以及如何添加进度条?

5 个答案:

答案 0 :(得分:6)

我有一个类似的用例,我使用自定义布局作为首选项。

在我的偏好片段文件中(省略了非相关属性)

<!-- res/xml/somePref.xml -->
<PreferenceScreen>
    <PreferenceCategory>
        ...
        <Preference android:widgetLayout="@layout/customLayout" />
        ...
    </PreferenceCategory>
</PreferenceScreen>

然后在自定义布局中,我自己放置了进度条

<!-- res/layout/customLayout.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/progress"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone">

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:indeterminateOnly="true" />

</RelativeLayout>

在开始异步任务之前,我打电话给

findViewById(R.id.progress).setVisibility(View.VISIBLE)

当任务完成后,我将可见性设置回去了。这将允许您独立设置每个首选项,而无需等待每个首选项完成。希望这会有所帮助。

答案 1 :(得分:6)

这就是我的所作所为:

  1. 创建自定义Preference类:

    public class LoadingPreference extends Preference {
        public LoadingPreference(Context context){
            super(context);
            setLayoutResource(R.layout.preference_loading_placeholder);
        }
    }
    
  2. 在保留首选项布局的同时创建自定义布局(preference_loading_placeholder):

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?android:attr/listPreferredItemHeight"
        android:gravity="center_vertical"
        android:paddingEnd="?android:attr/scrollbarSize"
        android:background="?android:attr/selectableItemBackground" >
    
        <ImageView
            android:id="@+android:id/icon"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_gravity="center"/>
    
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="15dip"
            android:layout_marginEnd="6dip"
            android:layout_marginTop="6dip"
            android:layout_marginBottom="6dip"
            android:layout_weight="1">
    
            <!-- (start) I added this part. -->
    
            <ProgressBar
                android:id="@+id/progressBar"
                android:layout_centerInParent="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:indeterminateTintMode="src_atop"
                android:indeterminateTint="@color/colorAccent"
                android:layout_gravity="center" />
    
            <TextView
                android:id="@+id/progressTitle"
                android:text="@string/loading"
                android:textSize="24sp"
                android:textColor="@color/colorAccent"
                android:layout_centerVertical="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="16dp"
                android:layout_toLeftOf="@+id/progressBar" />
    
            <!-- (end) I added this part. -->
    
            <TextView android:id="@+android:id/title"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:singleLine="true"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:ellipsize="marquee"
                android:fadingEdge="horizontal" />
    
            <TextView android:id="@+id/summary"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_below="@android:id/title"
                android:layout_alignStart="@android:id/title"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="?android:attr/textColorSecondary"
                android:maxLines="4" />
    
        </RelativeLayout>
    
        <!-- Preference should place its actual preference widget here. -->
        <LinearLayout android:id="@+id/widget_frame"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
             android:gravity="center_vertical"
             android:orientation="vertical"/>
    
    </LinearLayout>
    
  3. 使用PreferenceCategory来保存我的加载首选项:

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    
        <SwitchPreference
            android:key="@string/pref_key_wifi_enabled"
            android:title="@string/pref_title_wifi_enabled"
            android:summary="@string/pref_summary_wifi_enabled" />
    
        <Preference
            android:key="@string/pref_key_wifi_refresh"
            android:title="@string/pref_title_wifi_refresh"
            android:summary="@string/pref_summary_wifi_refresh"
            android:dependency="@string/pref_key_wifi_enabled"/>
    
        <PreferenceCategory
            android:key="@string/pref_key_wifi_section"
            android:title="@string/pref_title_wifi_section"
            android:summary="@string/pref_summary_wifi_section"
            android:dependency="@string/pref_key_wifi_enabled"/>
    
    </PreferenceScreen>
    
  4. 将加载首选项放在需要的位置

    ((PreferenceCategory)findPreference(WIFI_OPTIONS_SECTION_KEY)).addPreference(new LoadingPreference(getActivity()));
    
  5. 加载完成后删除加载首选项:

    ((PreferenceCategory)findPreference(WIFI_OPTIONS_SECTION_KEY)).removeAll();
    
  6. 加载完成后添加其他首选项:

    Preference p = new Preference(getActivity());
    p.setTitle("...");
    p.setSumary("...")     
    ((PreferenceCategory)findPreference(WIFI_OPTIONS_SECTION_KEY)).addPreferece(p);
    
  7. Loading Fragment Example

答案 2 :(得分:0)

我最终使用了以下方法。

在我的fragment_account.xml布局文件中。

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

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />

</RelativeLayout>

然后在我的课上:

public class AccountFragment extends PreferenceFragment {

        private ListView mListView;
        private ProgressBar mProgressBar;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_account, container, false);

            mListView = (ListView) view.findViewById(android.R.id.list);
            mProgressBar = (ProgressBar) view.findViewById(R.id.progress_bar);

            showProgress();

            return view;
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_account);
            hideProgress();
        }

        private void showProgress() {
            mListView.setVisibility(View.GONE);
            mProgressBar.setVisibility(View.VISIBLE);
        }

        private void hideProgress() {
            mListView.setVisibility(View.VISIBLE);
            mProgressBar.setVisibility(View.GONE);
        }
    }

}

答案 3 :(得分:0)

您可以尝试应用以下解决方案:

在您的偏好活动中使用片段。

  • 当您需要显示首选项时 - 显示首选项片段。
  • 当您需要显示进度时 - 显示进度片段。

以下是代码摘录:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    showPreferences();
    // or call showProgress, launch your task and call showPreferences upon completion
}

private void showPreferences() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            getFragmentManager()
                    .beginTransaction()
                    .replace(android.R.id.content, new YourPreferenceFragment())
                    .commit();
        }
    });
}

private void showProgress() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            getFragmentManager()
                    .beginTransaction()
                    .replace(android.R.id.content, new YourProgressFragment())
                    .commit();
        }
    });
}

答案 4 :(得分:-1)

在AsyncTasks默认方法

中使用以下概念
private class MyAsynTask extends AsyncTask<String, String, String> {

@Override
protected void onPreExecute() {
    super.onPreExecute();
    showDialog();// show your progressbar
}

@Override
protected String doInBackground(String... urls) {
   //your code
}

protected void onProgressUpdate(String... progress) {        
progressDialog.setProgress(Integer.parseInt(progress[0]));
// here you get the value of progress
}

@Override
protected void onPostExecute(String result) {           
    dismissDialog(); //dismiss progressbar
}
 }