11

Ich habe meine Einstellungen wie in den offiziellen Richtlinien dargestellt implementiert.Zeige-Schaltfläche in actionBar in Subscreen-Einstellungen

Ich habe eine PreferenceActivity die die PreferenceFragment wie folgt erzeugt:

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

     Bundle extras = getIntent().getExtras(); 
     if (extras != null) 
     { 
      Bundle bundle = new Bundle(); 
      _widgetID = extras.getInt(GlobalSettings.EXTRA_WIDGET_ID); 
      bundle.putInt(GlobalSettings.EXTRA_WIDGET_ID, _widgetID); 

      WidgetSettingsFragment fragment = new WidgetSettingsFragment(); 
      fragment.setArguments(bundle); 

      getFragmentManager().beginTransaction().replace(android.R.id.content, 
         fragment).commit(); 
     } 

} 

Die PreferenceFragment die Präferenzen von den Ressourcen geladen und sie enthalten eine Präferenz Subscreen wie folgt aus:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- opens a subscreen of settings --> 
    <PreferenceScreen 
     android:key="button_voicemail_category_key" 
     android:title="@string/voicemail" 
     android:persistent="false"> 
     <ListPreference 
      android:key="button_voicemail_provider_key" 
      android:title="@string/voicemail_provider" ... /> 
     <!-- opens another nested subscreen --> 
     <PreferenceScreen 
      android:key="button_voicemail_setting_key" 
      android:title="@string/voicemail_settings" 
      android:persistent="false"> 
      ... 
     </PreferenceScreen> 
     <RingtonePreference 
      android:key="button_voicemail_ringtone_key" 
      android:title="@string/voicemail_ringtone_title" 
      android:ringtoneType="notification" ... /> 
     ... 
    </PreferenceScreen> 
    ... 
</PreferenceScreen> 

Das funktioniert gut so weit, aber jetzt möchte ich eine up-Button in der actionBar haben, wenn der Subscreen Einstellungen angezeigt wird. Irgendeine Idee, wie man das erreicht?

Ich habe versucht, setDisplayHomeAsUpEnabled(true) in meiner Aktivität zu setzen, aber dann wird der up-Button nur in den Haupteinstellungen angezeigt (wo es nicht sollte) und nicht im Subscreen.

Ich wundere mich, dass auch in den offiziellen Dokumenten die Subscreen ohne aktive up-Taste angezeigt wird: Setting subscreens

Link zu der Dokumentation: Settings

Jede Hilfe sehr willkommen

ist
+0

Afaik nach Design Beratung von Google , ist die Zurück-Taste des Systems für solche Situationen besser als die Navigation nach oben. Andernfalls, wenn Sie Ihre eigene neue Aktivität erstellen, können Sie sehr gut mit getActionBar() fertig werden. SetDisplayHomeAsUpEnabled (true) für * diese * bestimmte Subscreen-Aktivität. – webuster

+0

Es gibt diese fast genau die gleiche Frage: http://StackOverflow.com/Questions/11971800/Sethomebuttonenabled-on-preferenceactivity-and-nested-preference – Mdlc

+2

Das Problem ist, dass ich nur ein 'PreferenceFragment' habe, das die Einstellungen und automatisch zeigt der Subscreen der Einstellungen. Ich habe keine Aktivität oder Fragmentklasse für den Subscreen. Ich habe keine Ahnung, wie ich überprüfen kann, ob der Subscreen angezeigt wird, um 'setDisplayHomeAsUpEnabled (true) 'aufzurufen, da mir dafür keine Schnittstelle oder Callback bekannt ist. – user1567896

Antwort

12

Ich habe es endlich zur Arbeit gebracht: D. Es ist ziemlich hacky, aber es funktioniert.

Das Problem ist, dass die Verwendung von Subscreens in XML-Layouts einige 'Code Magic' ergibt. Eine neue Aktivität/ein neuer Dialog wird für den Subscreen gestartet und Sie haben keinen direkten Zugriff darauf.

Um Zugriff auf die Aktionsleiste und den OnClickListener der Home/Up-Schaltfläche zu erhalten, müssen Sie einen Verweis auf Ihren PreferenceScreen erhalten und den übergeordneten Dialog aufrufen, um auf die Aktionsleiste und ihre Home/Up-Schaltfläche zuzugreifen.

Dies ist, wie es in meinem PreferenceFragment getan wird:

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

final PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference(getString(R.string.keyPrefScreenDynamicWidgetDetails)); 
    preferenceScreen.setOnPreferenceClickListener(new OnPreferenceClickListener() 
    { 
     public boolean onPreferenceClick(Preference preference) 
     { 
      preferenceScreen.getDialog().getActionBar().setDisplayHomeAsUpEnabled(true); 
      final Dialog dialog = preferenceScreen.getDialog(); 

      View homeBtn = dialog.findViewById(android.R.id.home); 
      if (homeBtn != null) 
      { 
       OnClickListener dismissDialogClickListener = new OnClickListener() 
       { 
        @Override 
        public void onClick(View v) 
        { 
         dialog.dismiss(); 
        } 
       }; 

       // Prepare yourselves for some hacky programming 
       ViewParent homeBtnContainer = homeBtn.getParent(); 

       // The home button is an ImageView inside a FrameLayout 
       if (homeBtnContainer instanceof FrameLayout) { 
        ViewGroup containerParent = (ViewGroup) homeBtnContainer.getParent(); 

        if (containerParent instanceof LinearLayout) { 
         // This view also contains the title text, set the whole view as clickable 
         ((LinearLayout) containerParent).setOnClickListener(dismissDialogClickListener); 
        } else { 
         // Just set it on the home button 
         ((FrameLayout) homeBtnContainer).setOnClickListener(dismissDialogClickListener); 
        } 
       } else { 
        // The 'If all else fails' default case 
        homeBtn.setOnClickListener(dismissDialogClickListener); 
       }     
      } 
      return true; 
     } 
    }); 
... 

} 

Nach Link gab mir die letzten Hinweise und Code mein Problem zu lösen:

Action Bar Home Button not functional with nested PreferenceScreen

+1

Clever aber hacky und möglicherweise nicht tragbar. Es beruht auf Implementierungsdetails eines Dialogs, den Sie nicht steuern. –

3

Ich mache dies für die Android-Dokumente in der "Unterstützung älterer Versionen mit Präferenz-Header" Abschnitt http://developer.android.com/guide/topics/ui/settings.html#BackCompatHeaders. Mit der Legacy PreferenceActivity geben Sie eine Präferenz in der XML-Datei an, die eine Intention für dieselbe Präferenzaktivitätsklasse auslöst. Die Aktivität überprüft die Absichtsaktion und bestimmt, ob sie verschachtelt ist oder nicht (um die Schaltfläche "Hoch" anzuzeigen) und welche Präferenz xml auf dem Bildschirm aufgepumpt werden soll.

Natürlich möchte ich auch ältere Geräte unterstützen. Ich habe festgestellt, dass das PreferenceFragment nur für große Tablets nützlich ist, die Präferenzheader verwenden.

Um Präferenzen zwischen Handys und Tabletten wiederzuverwenden kam ich mit dieser Lösung bis https://stackoverflow.com/a/20806812/1139784

-5

die Aktion gehen Sie wie folgt zu aktivieren:

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
getSupportActionBar().setDisplayUseLogoEnabled(true); 

das Sie auf das Symbol geben.

dann

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     // Respond to the action bar's Up/Home button 
     case android.R.id.home: 
      finish(); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

hinzufügen Sie dies ändern können, zu gehen, wo man es braucht. Als weitere Option können Sie die Methoden "navigateUpTo" (Intent Intent) und "onSupportNavigateUpTo" (Intent Intent) verwenden und die Absicht angeben, zu der Sie zurückkehren möchten.

+0

Danke für die Antwort, aber das ist keine Antwort auf meine Frage – user1567896