androidandroid-actionbarpreferenceactivitypreferencefragment

Keep the actionbar displayed in when changing PreferenceScreen


I'm trying to display a actionbar in my preference screen. In order to do so I added the following code in my SettingActivity

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

then the rest of my code in PreferencesFragment. This works fine, but as soon as I press on a PreferenceScreen preference, the actionbar is hidden. If I go back to the preference main screen I can see it again. Any idea how to keep the actionbar displayed (and updated with the PreferenceScreen label) ?

Edit: Looking at the PreferenceScreen code it looks like a full screen Dialog is opened when the PreferenceScreen is clicked on. Because my preference has a title the Dialog should display a title as well... but it doesn't

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

Solution

  • I finally managed to find a way to do this. It's kind of ugly but it works.

    First I add an the same Intent to every PreferenceScreen definition in my preferences.xml file (make sure to update the value of the extra parameter)

            <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 is my current Preference Activity

    Then I add an intent-filter in the 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>
    

    I add some code in the PreferenceActivity to handle this

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

    Finally I add the following code in my PreferencesFragment class

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