2016-07-05 4 views
3

Wie kann ich einen Fortschrittsbalken in einem PreferenceFragment hinzufügen? Ich habe eine asynchrone Task ausgeführt, die nach Abschluss einige Werte in meiner Präferenz anzeigt. Während ich den Hintergrundprozess ausführe, möchte ich nur einen Fortschrittsbalken in der Mitte anzeigen. Nachdem die Aufgabe abgeschlossen ist, möchte ich alle meine Einstellungen anzeigen.Wie füge ich eine Fortschrittsleiste in einem PreferenceFragment in Android hinzu?

Hier ist, was ich bisher habe.

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> 

Meine Frage ist, da dies ein PreferenceFragment ist, und ich bin überschreibt die Methode nicht onCreateView, wo und wie sollte ich hinzufügen, um die Fortschritts ?

Antwort

-1

Verwenden Sie das folgende Konzept in AsyncTasks Standardmethoden

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

Danke, aber ich bezog sich auf den Teil, wo ich den Fortschrittsbalken setzen sollte, da ich keine Sicht auf das Fragment abgesehen von der pref_account aufpumpen. XML. – ank

1

ich einen ähnlichen Anwendungsfall hatte und ich verwenden, um ein benutzerdefiniertes Layout für die Bevorzugung.

in der Präferenzfragmentdatei I hatte (nicht relevante Attribute sind weggelassen)

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

dann in dem benutzerdefinierten Layout platziert I die Fortschrittsbalken selbst

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

Vor der Async Aufgabe I Ausgang Anruf

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

und wenn die Aufgabe erledigt ist, setze ich die Sichtbarkeit zurück auf g ein. Auf diese Weise können Sie die einzelnen Einstellungen unabhängig voneinander festlegen, ohne auf den Abschluss jedes einzelnen zu warten. Hoffe das hilft.

2

Hier ist, was ich getan habe:

  1. eine benutzerdefinierte Vorlieben Klasse erstellen:

    public class LoadingPreference extends Preference { 
        public LoadingPreference(Context context){ 
         super(context); 
         setLayoutResource(R.layout.preference_loading_placeholder); 
        } 
    } 
    
  2. eigenes Layout erstellen (preference_loading_placeholder), während das Layout Preference Erhaltung:

    <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. Verwendet eine PreferenceCategory, um mein Laden bevorzugt zu halten 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. den Vorzug Laden Setzen wo

    benötigt
    ((PreferenceCategory)findPreference(WIFI_OPTIONS_SECTION_KEY)).addPreference(new LoadingPreference(getActivity())); 
    
  5. die Lade Präferenz entfernen, nachdem der Ladevorgang abgeschlossen ist:

    ((PreferenceCategory)findPreference(WIFI_OPTIONS_SECTION_KEY)).removeAll(); 
    
  6. andere Vorlieben hinzufügen nach dem Laden abgeschlossen ist:

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

Loading Fragment Example

+0

Danke. Ich habe jedoch etwas anderes gemacht. – ank

0

landete ich mit dem folgenden Ansatz auf.

In meiner Fragment_account.xml-Layout-Datei.

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

Dann auf meiner Klasse:

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

Sie könnten versuchen, die folgende Lösung anwenden:

Verwenden Fragmente in Ihrer Präferenz Aktivität.

  • Wenn Sie Voreinstellungen anzeigen müssen - Anzeige Präferenz Fragment.
  • Wenn Sie den Fortschritt anzeigen müssen - Anzeige des Fortschrittsfragments. Hier

ist ein Codeauszug:

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