18

Ich versuche eine Aktionsleiste in meinem Einstellungsbildschirm anzuzeigen. Um dies zu tun, habe ich den folgenden Code in meinem SettingActivityBehalte die Aktionsleiste, die angezeigt wird, wenn ich PreferenceScreen ändere

public class PreferencesActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.preferences_activity); 
     getFragmentManager().beginTransaction() 
       .replace(R.id.container, new PreferencesFragment()).commit(); 

      getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP); 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 
} 

dann den Rest meines Codes in PreferencesFragment. Das funktioniert gut, aber sobald ich auf eine PreferenceScreen-Präferenz drücke, wird die Aktionsleiste ausgeblendet. Wenn ich zum bevorzugten Hauptbildschirm zurückkehre, kann ich es wieder sehen. Haben Sie eine Idee, wie die Aktionsleiste angezeigt (und mit dem PreferenceScreen-Label aktualisiert) werden kann?

Bearbeiten: Wenn Sie den PreferenceScreen-Code betrachten, sieht er wie ein Vollbild aus Dialog wird geöffnet, wenn auf den PreferenceScreen geklickt wird. Da meine Vorliebe einen Titel hat der Dialog sollte auch einen Titel anzuzeigen ... aber es funktioniert nicht

// Set the title bar if title is available, else no title bar 
    final CharSequence title = getTitle(); 
    Dialog dialog = mDialog = new Dialog(context, context.getThemeResId()); 
    if (TextUtils.isEmpty(title)) { 
     dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    } else { 
     dialog.setTitle(title); 
    } 
+0

Meinten Sie ActionBar? –

+0

ja sorry ActionBar – user1026605

+0

@ user1026605 hat das jemals gelöst? –

Antwort

6

ich es endlich geschafft, einen Weg zu finden, dies zu tun. Es ist irgendwie hässlich, aber es funktioniert.

Zuerst habe ich eine die gleiche Absicht zu jeder PreferenceScreen Definition in meiner preferences.xml Datei hinzufügen (stellen Sie sicher, den Wert des zusätzlichen Parameter zu aktualisieren)

 <PreferenceScreen 
      android:key="pref1" 
      android:summary="Summary1" 
      android:title="Title1" > 
      <intent 
       android:action="android.intent.action.VIEW" 
       android:targetPackage="my.package" 
       android:targetClass="my.package.activity.PreferencesActivity" > 
       <extra android:name="page" android:value="pref1" /> 
      </intent> 
... 

</PreferenceScreen> 

BTW my.package.activity.PreferencesActivity ist meine aktuelle Präferenz Aktivität

Dann füge ich ein Intent-Filter in dem Manifest

 <activity 
      android:name=".activity.PreferencesActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize" 
      android:label="@string/settings" > 
      <intent-filter android:label="Pref" > 
       <action android:name="android.intent.action.VIEW" /> 
       <category android:name="android.intent.category.PREFERENCE" /> 
      </intent-filter> 
    </activity> 

füge ich einige Code in der PreferenceActivity dieses Schließlich

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.preferences_activity); 

     this.fragment = new PreferencesFragment(); 
     this.fragment.setActivityIntent(getIntent()); 
     getFragmentManager().beginTransaction() 
       .replace(R.id.container, this.fragment).commit(); 
    } 

behandeln ich den folgenden Code hinzufügen in meinen EinstellungenFragment Klasse

public void setActivityIntent(final Intent activityIntent) { 
if (activityIntent != null) { 
         if (Intent.ACTION_VIEW.equals(activityIntent.getAction())) { 

         if (intent.getExtras() != null) { 
          final String page = intent.getExtras().getString("page"); 
          if (!TextUtils.isEmpty(page)) { 
           openPreferenceScreen(page); 
          } 
         } 
        } 
    } 

private void openPreferenceScreen(final String screenName) { 
    final Preference pref = findPreference(screenName); 
    if (pref instanceof PreferenceScreen) { 
     final PreferenceScreen preferenceScreen = (PreferenceScreen) pref; 
     ((PreferencesActivity) getActivity()).setTitle(preferenceScreen.getTitle()); 
     setPreferenceScreen((PreferenceScreen) pref); 
    } 
} 
+3

Dies funktionierte für mich nach einer leichten Änderung: Der 'PreferenceManager '' PreferencesFragment' wird nicht erstellt, bis' onCreate() 'aufgerufen wird, also versucht zu finden und Navigieren Sie zum richtigen Bildschirm in 'setActivityIntent()' wird fehlschlagen. Stattdessen benutze ich 'setActivityIntent()', um den Namen des 'PreferenceScreen' zu extrahieren und zu speichern, und später in 'onCreate()' rufe ich 'openPreferenceScreen()' auf, um dorthin zu navigieren. – josh2112

+2

Ich habe einen Fehler gemeldet, bitte stimme dafür: https://code.google.com/p/android/issues/detail?id=207718 –

+1

Ich habe es gerade versucht und es hat immer eine weitere Kopie meines ursprünglichen PreferenceFragments geöffnet, wann immer ich versucht, Subscreens zu öffnen. – CiaranC94

0

Ich habe eine App aus, die eine Aktionsleiste in der Präferenzen Aktivität hat. Ich scheine den Schlüssel dazu nicht zu sehen, obwohl ich mich erinnere, dass ich einige Zeit gebraucht habe, um es richtig zu nageln.

Es scheint, als wären unsere Codes sehr ähnlich. Das einzige, was mir zur Kenntnis kommt, ist dieser Import: import android.support.v7.app.ActionBarActivity;

Lassen Sie mich wissen, ob die eine

hilft
public class SettingsActivity extends ActionBarActivity { 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit(); 
    } // End of onCreate 



    static public class PrefsFragment extends PreferenceFragment { 

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

      addPreferencesFromResource(R.xml.preferences); // Load the preferences from an XML resource 


     } 

    } // end of PrefsFragment 

} 

Ergänzung: Sie haben diese in Ihrem styles.xml?

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
</style> 
+0

Wie erläutert In meiner Frage habe ich bereits die Aktionsleiste im Hauptbildschirm der Einstellung angezeigt. Das Problem ist, dass es verschwindet, sobald ich auf eine PreferenceScreen-Einstellung drücke. Ich möchte es behalten und die Actionbar-Anzeige mit dem Namen der PreferenceScreen, die gedrückt wurde – user1026605

+0

@Bruno Carrier, ist 'PreferenceFragment' unterstützt API-Ebene <'Honey Comb' –

+0

Es ist, aber es funktioniert nicht genau in der gleichen Weise. Siehe diesen Beitrag für eine gründliche Antwort: http://stackoverflow.com/questions/10186697/referenceactivity-android-4-0-and-earlier –

0

aber sobald ich auf einer PreferenceScreen Präferenz drücken, ist die ActionBar versteckt. Wenn ich zum bevorzugten Hauptbildschirm zurückkehre, kann ich es wieder sehen.

Ich denke, Sie sind eine neue Aktivität starten, wenn auf der Präferenz geklickt

Ihre Präferenz Fragment ähnliche

public static class PreferencesFragment extends PreferenceFragment { 

    public PlaceholderFragment() { 
    } 

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

Dann Probe your_preferences wie unten

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_height="fill_parent" 
android:layout_width="fill_parent" > 

<PreferenceCategory 
    android:title="@string/pref_category_title"> 
    <PreferenceScreen 
     android:title="@string/title" 
     android:summary="@string/summary"> 

     <intent 
      android:targetClass="com.your.package.Youractivity " 
      android:targetPackage="com.your.package"/> 

    </PreferenceScreen> 
    <PreferenceScreen 
     android:title="@string/another_title"> 
     <intent 
      android:targetClass="com.your.package.activity2" 
      android:targetPackage="com.your.package.activity"/> 
    </PreferenceScreen> 
</PreferenceCategory> 

aussehen sollte

Und schließlich die Hauptsache Youractivity von ActionBarActivity

public class Youractivity extends ActionBarActivity { 
} 

Der obige Code funktioniert bei mir verlängern sollte.

+0

Nein, ich bin nicht. Ich benutze nur eine Standard-Preference.xml Res-Datei, mit einigen Standard PreferenceScreen Pref, wie in meiner Frage erläutert. Ich starte keine weitere Aktivität vom PreferenceScreen. Ich habe nur andere Präferenzen in die PreferenceScreen-Tags eingebettet – user1026605

0

Wie Sie in der Frage erwähnt haben, könnte der Fullscreen Dialog ein Problem sein.

Versuchen Sie, ändern Sie die Dialog Stil:

<style name="Theme.Holo.Dialog"> 

oder Stil, die diese Eigenschaften hat:

<item name="windowActionBar">true</item> 
<item name="windowNoTitle">false</item> 

Here lesen Sie, wie Bezug auf die Dialog zu erhalten.

0

Hinweis: Nur für API> = 14

Source1 und Source2

PreferenceActivity1.java

public class PreferenceActivity1 extends android.preference.PreferenceActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.pref1); 

} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 

    LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent(); 
    Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false); 
    root.addView(bar, 0); // insert at top 
    bar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }); 
} 
} 

PreferenceActivity2.java

public class PreferenceActivity2 extends android.preference.PreferenceActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.pref2); 
} 
@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 

    LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent(); 
    Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false); 
    root.addView(bar, 0); // insert at top 
    bar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }); 
} 
} 

settings_toolbar.xml (Layout)

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/toolbar" 
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:minHeight="?attr/actionBarSize" 
app:navigationContentDescription="@string/abc_action_bar_up_description" 
android:background="?attr/colorPrimary" 
app:navigationIcon="?attr/homeAsUpIndicator" 
app:title="@string/app_name" 
/> 

pref1.xml (xml)

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

<PreferenceCategory android:title="Main Preferences" > 
    <CheckBoxPreference 
     android:key="wifi enabled" 
     android:title="WiFi" /> 
</PreferenceCategory> 

<PreferenceScreen 
    android:key="key1" 
    android:summary="" 
    android:title="Wifi Settings" > 
    <intent 
     android:action="android.intent.action.VIEW" 
     android:targetClass="com.example.PreferenceActivity2" 
     android:targetPackage="com.example" /> 
</PreferenceScreen> 

</PreferenceScreen> 

pref2.xml (xml)

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

<PreferenceCategory android:title="Wifi Settings" > 
    <CheckBoxPreference 
     android:key="prefer wifi" 
     android:title="Prefer WiFi" /> 
</PreferenceCategory> 

</PreferenceScreen> 

Manifest

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name="com.example.PreferenceActivity1" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.example.PreferenceActivity2" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
</application> 

Ergebnis
enter image description here
enter image description here

+0

, wie in meiner Frage erläutert, das Problem besteht nicht darin, die Aktionsleiste auf der Präferenz 'Hauptbildschirm' anzuzeigen. Was passiert, wenn Sie WLAN-Einstellungen drücken? Wird die Aktionsleiste immer noch angezeigt? BTW mein min sdk ist 14 – user1026605

+0

keine Möglichkeit, es mit der Standard-ActionBar arbeiten zu lassen? – user1026605

+0

Ich glaube nicht, Dies ist nur eine Problemumgehung –

6

Hatte die sa ich Frage. Verschachtelte PreferenceScreen s hatte keine ActionBar. Nach dem Durchlaufen des Codes scheint es durch einen Konflikt zwischen AppCompatActivity und PreferenceScreen verursacht worden zu sein.

Auf der einen Seite AppCompatActivity bietet eine eigene Aktionsleiste, und erfordert daher ein Thema von Theme.AppCompat absteigend, die windowNoTitle = true irgendwo angibt (konnte nicht genau wo genau). Auf der anderen Seite verwendet PreferenceScreen die Plattform Dialog mit dem Aktivitätsthema (anstelle des Unterthemas, z. B. dialogTheme). Könnte ein Fehler sein.

Wenn Sie nicht über Theme.AppCompat egal, hier ist eine einfache Abhilfe, die auf API arbeitet 21+:

  • Verwendung android.preference.PreferenceActivity als Basisklasse für Ihre Aktivität
  • für diese Tätigkeit ein Thema erstellen:

    <!-- This theme is used to show ActionBar on sub-PreferenceScreens --> 
    <style name="PreferenceTheme" parent=""> 
        <item name="android:windowActionBar">true</item> 
        <item name="android:windowNoTitle">false</item> 
    </style> 
    
  • angeben android:theme="@style/PreferenceTheme" für diese Aktivität in den AndroidManifest.xml

Was Sie erhalten, ist mehr wie ein Standardfenstertitel als eine vollständige ActionBar. Ich habe noch nicht herausgefunden, wie Sie eine funktionierende Schaltfläche, etc. hinzufügen können.

Wenn Sie mit AppCompatActivity und den zugehörigen Designs kompatibel bleiben möchten, müssen Sie im Aktivitätsfenster FEATURE_NO_TITLE anfordern. Andernfalls erhalten Sie zwei Aktionsleisten (die oben eingebaute und die untere Unterstützung) in der obersten Ebene PreferenceScreen.

1

Da Google leider hat es bis jetzt nicht festgelegt, es ist eigentlich eine viel einfachere Lösung:

  1. Ihre SettingsActivity Klasse Set von nur „Activity“ zu erweitern.

    public class SettingsActivity extends Activity { ...

  2. Erstellen Sie ein neues Thema in Ihrem v21/styles Ordner für Ihre SettingsActivty und stellen Sie die Eltern zu "Theme.Material. *"

    <style name="CustomThemeSettings" parent="android:Theme.Material"> <item name="android:colorPrimary">@color/...</item> <item name="android:colorPrimaryDark">@color/...</item> <item name="android:colorAccent">@color/...</item> </style>

  3. Stellen Sie Ihr neues Thema in dein Manifest.XML-Datei:

    <activity android:name=".SettingsActivity" android:label="@string/title_activity_settingsactivity" android:theme="@style/CustomThemeSettings" > </activity>

  4. Es funktioniert einfach :)

  5. (Optional) Wenn Sie möchten, für ältere Geräte Material Design Unterstützung bieten
    Sie die SettingsActivity in einem v21 + Ordner setzen und erstellen eine andere SettingsActivity für ältere Geräte, die die übergeordnete AppCompat hat.