2016-07-05 3 views
3

Как добавить индикатор выполнения в PreferenceFragment? У меня запущена задача async, которая будет показывать некоторые значения в моих предпочтениях после завершения. Поэтому, когда он выполняет фоновый процесс, я планирую показать только индикатор выполнения в центре. После завершения задачи, я планирую показать все мои предпочтения.Как добавить панель выполнения в PreferenceFragment в Android?

Вот что у меня есть.

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, где и как я должен добавить индикатор ?

ответ

-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 
} 
} 
+0

Спасибо, но я имел в виду часть, где я должен поставить индикатор, так как я не раздувания любой взгляд на фрагменте в стороне от pref_account. XML. – ank

1

У меня был подобный случай использования, и я использовал пользовательский макет для предпочтения.

В файле фрагмента предпочтения я имел (соответствующие атрибуты не являющиеся опущены)

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

Перед началом асинхронной задачи I звоните

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

и когда задача выполнена, я установил видимость на g один. Это позволит вам установить каждое предпочтение независимо, не дожидаясь завершения каждого из них. Надеюсь это поможет.

2

Вот что я сделал:

  1. Создание пользовательского класса предпочтений:

    public class LoadingPreference extends Preference { 
        public LoadingPreference(Context context){ 
         super(context); 
         setLayoutResource(R.layout.preference_loading_placeholder); 
        } 
    } 
    
  2. Создание пользовательского макета (preference_loading_placeholder), сохраняя при этом расположение Preference:

    <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, чтобы сохранить предпочтение загрузки ENCE:

    <?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); 
    

Loading Fragment Example

+0

Спасибо. Однако, я закончил делать что-то другое. – ank

0

Я в конечном итоге, используя следующий подход.

В моем файле layout_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); 
     } 
    } 

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