2

Ich bin ziemlich neu in Android Präferenz-System und ich bin derzeit mit einem Problem konfrontiert.So erzwingen sub Preferencescreen in Fragment-Layout enthalten sein (Android)

Wie von Android Guide (http://developer.android.com/guide/topics/ui/settings.html) empfohlen, verwende ich Preference Fragment. Daher enthält meine SettingsActivity einige Dinge (Header wie Titel, Tabs usw.) und das PreferenceFragment darunter.

Die Sache ist, wenn ich auf eine Präferenz, die einem "Sub" PreferenceScreen zugeordnet ist, klicke, der "neue Einstellungsbildschirm" respektiert nicht das Layout meines Fragments, sondern füllt stattdessen die gesamte Aktivität.

Hier ist ein Beispiel: Nehmen wir an, ich habe eine PreferenceFragment, die addPreferenceFromResource (R.xml.preferences) aufruft. preferences.xml enthält eine Voreinstellung "Kennwort ändern", bei der es sich um eine Voreinstellung handelt, die 3 TextEditPreference enthält.

preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <EditTextPreference android:title="@string/pref_one"/> 
    <EditTextPreference android:title="@string/pref_two"/> 

    <PreferenceScreen android:title="@string/pref_change_password"> 

     <EditTextPreference android:title="@string/pref_current_pass" 
      android:inputType="textPassword" 
      android:hint="@string/hint_current_password" /> 

     <EditTextPreference android:title="@string/pref_new_pass" 
      android:inputType="textPassword" 
      android:hint="@string/hint_new_password" /> 

     <EditTextPreference android:title="@string/pref_confirm_new_pass" 
      android:inputType="textPassword" 
      android:hint="@string/hint_confirm_new_password" /> 

    </PreferenceScreen> 
</PreferenceScreen> 

Also, wenn ich auf dem PreferenceScreen klicken, wird es das: The entire activity is filled by the preferenceScreen

Aber ich will es, das zu tun: enter image description here

Wie kann ich tun Das? Vielen Dank im Voraus für Ihre Antworten!

Antwort

2

Okay, nach einem tiefen Tauchgang in Android Reference fand ich die Lösung.

Es scheint, dass beim Klicken auf einen Sub-PreferenceScreen ein Dialog geöffnet wird, der die neuen Preference-Objekte enthält, keine neue Activity oder was auch immer.

Die Lösung besteht also darin, den Dialog abzurufen und in das Layout des ursprünglichen PreferenceFragments einzufügen. Dazu habe ich die onPreferenceTreeClick Callback-Methode zu erkennen, ob ein PreferenceScreen geklickt wird:

public class SettingsFragment extends PreferenceFragment { 

    // onCreate and other stuff... 

    @Override 
    public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen, 
              Preference preference) { 

     // Initiating Dialog's layout when any sub PreferenceScreen clicked 
     if(preference.getClass() == PreferenceScreen.class) { 
      // Retrieving the opened Dialog 
      Dialog dialog = ((PreferenceScreen) preference).getDialog(); 
      if(dialog == null) return false; 

      initDialogLayout(dialog); // Initiate the dialog's layout 
     } 
     return true; 
    } 

    private void initDialogLayout(Dialog dialog) { 
     View fragmentView = getView(); 

     // Get absolute coordinates of the PreferenceFragment 
     int fragmentViewLocation [] = new int[2]; 
     fragmentView.getLocationOnScreen(fragmentViewLocation); 

     // Set new dimension and position attributes of the dialog 
     WindowManager.LayoutParams wlp = dialog.getWindow().getAttributes(); 
     wlp.x  = fragmentViewLocation[0]; // 0 for x 
     wlp.y  = fragmentViewLocation[1]; // 1 for y 
     wlp.width = fragmentView.getWidth(); 
     wlp.height = fragmentView.getHeight(); 

     dialog.getWindow().setAttributes(wlp); 

     // Set flag so that you can still interact with objects outside the dialog 
     dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 
    } 
} 

Und das ist es, dass der Trick gemacht. Bitte kommentieren Sie, wenn Sie denken, dass es einen besseren Weg gibt.

+0

Es funktioniert. aber ohne den Schatten. und Sie müssen sich mit dem Aktionsleisten-Icon zurückdrücken. – motis10

Verwandte Themen