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

m528fe3b  于 2022-12-31  发布在  Android
关注(0)|答案(6)|浏览(190)

如何在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方法,那么我应该在哪里以及如何添加进度条呢?

j2datikz

j2datikz1#

我是这么做的:
1.创建自定义首选项类:

public class LoadingPreference extends Preference {
    public LoadingPreference(Context context){
        super(context);
        setLayoutResource(R.layout.preference_loading_placeholder);
    }
}

1.创建自定义布局(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>

1.使用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>

1.将加载首选项放在需要的位置

((PreferenceCategory)findPreference(WIFI_OPTIONS_SECTION_KEY)).addPreference(new LoadingPreference(getActivity()));

1.加载完成后删除加载首选项:

((PreferenceCategory)findPreference(WIFI_OPTIONS_SECTION_KEY)).removeAll();

1.加载完成后添加其他首选项:

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

wlsrxk51

wlsrxk512#

我有一个类似的用例,我使用了一个自定义布局的首选项。
在我拥有的首选项片段文件中(不相关的属性被省略)

<!-- 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)

当任务完成时,我将可见性设置回gone。2这将允许您独立设置每个首选项,而不必等待每个首选项完成。3希望这对您有所帮助。

gijlo24d

gijlo24d3#

我最终使用了以下方法。
在我的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);
        }
    }

}
uxh89sit

uxh89sit4#

您可以尝试应用以下解决方案:
在你的偏好活动中使用片段。

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

下面是一段代码摘录:

@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();
        }
    });
}
pcww981p

pcww981p5#

使用这种方法。创建一个自定义布局的对话框,其中有一个progressBar,只需调用show()和dismiss()。

@Synchronized
fun showLoader(activity: Activity) {
        val activityWeakReference = WeakReference(activity)
        if (activityWeakReference.get() != null) {
            hideLoader()
            dialog = Dialog(activityWeakReference.get()!!, android.R.style.Theme_Translucent)
            dialog?.window?.requestFeature(Window.FEATURE_NO_TITLE)
            dialog?.setContentView(R.layout.progress_indicator)
            dialog?.setCancelable(false)
            dialog?.show()
        }
    }

@Synchronized
fun hideLoader() {
    dialog?.dismiss()
    dialog = null
}
kqqjbcuj

kqqjbcuj6#

在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
}
 }

相关问题