web-dev-qa-db-fra.com

ajouter une barre d'action avec le bouton de retour dans l'activité de préférence

Voici mon activité de préférence:

package com.example.hms.test;

import Android.os.Bundle;
import Android.preference.PreferenceActivity;

public class PrefsActivity extends PreferenceActivity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs);
    }

}

ici, je veux montrer une barre d'action avec les paramètres de nom et un bouton de retour à la maison

9
user6313452

Vous devriez faire quelques choses:

  1. Ajoutez ce qui suit à votre onCreate of PreferenceActivity:

    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
  2. Remplacer onOptionsItemSelected in PreferenceActivity:

    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId())
         {
             case Android.R.id.home:
                 NavUtils.navigateUpFromSameTask(this);
                 return true;
         }
         return super.onOptionsItemSelected(item);
     }
    
  3. changez la balise <activity> dans manifest pour que votre PreferenceActivity ressemble à ceci:

    <activity
      Android:name=".PrefsActivity"
      Android:label="@string/title_activity_settings"
      Android:parentActivityName=".MainActivity">
      <meta-data
        Android:name="Android.support.PARENT_ACTIVITY"
        Android:value="com.example.Android.MainActivity" />
    </activity>
    
  4. Enfin, mettez Android: launchMode = "singleTop" dans votre balise MainActivity <activity> du manifeste:

    <activity
      Android:name=".MainActivity"
      Android:label="@string/app_name"
      Android:launchMode="singleTop"
      Android:theme="@style/AppTheme.NoActionBar">
      <intent-filter>
        <action Android:name="Android.intent.action.MAIN" />
    
        <category Android:name="Android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    
19
Pooya

La réponse donnée par Pooya ne fonctionnera pas pour une activité PreferenceActivity. Faites plutôt que votre classe étende AppCompatActivity et utilisez un PreferenceFragment pour charger la préférence. Voici mon code pour les paramètres: 

public class MyPrefsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(Android.R.id.content, new MyPreferenceFragment()).commit();

        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    }

    @Override
    public boolean onSupportNavigateUp(){
        finish();
        return true;
    }

    public static class MyPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
        }
    }
}

Mettez l'activité dans votre AndroidManifest.XML:

<activity Android:name=".MyPrefsActivity"
    Android:label="Preferences"
    Android:theme="@style/AppTheme"/>

Et maintenant, vous pouvez commencer l'activité de paramétrage en utilisant une intention dans mon activité principale (ou n'importe quelle activité parent que vous avez) comme d'habitude: 

Intent prefsIntent = new Intent(activity, MyPrefsActivity.class);
activity.startActivity(prefsIntent);
9
Baldeep

J'avais besoin de différents éléments de menu de la barre d'actions dans mes activités; j'ai donc créé mon MainActivity avec un singleMode launchMode. Cela a été formidable pour la configuration de la barre d'action de l'activité de mon enfant, mais cela a laissé l'activité de mes préférences sans barre d'action. 

En fin de compte, la clé était de s’assurer que le thème MainActivity avait un parent de Theme.AppCompat.Light.NoActionBar:

       <activity
            Android:name=".MainActivity"
            Android:label="@string/app_name"
            Android:launchMode="singleTop"
            Android:theme="@style/AppTheme">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

et le thème SettingsActivity avait le parent Theme.AppCompat.Light.DarkActionBar:

    <activity
        Android:name=".SettingsActivity"
        Android:label="@string/title_activity_settings"
        Android:theme="@style/SettingsTheme"
        Android:parentActivityName=".MainActivity">
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="net.deatrich.app.bodyandminddbt.MainActivity" />
    </activity>

Dans styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>

</style>

<style name="SettingsTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

Il y a probablement une meilleure façon de le coiffer mais cela fonctionne.

Pour tous ceux qui liront, n'oubliez pas de dériver votre SettingsActivity de AppCompatPreferenceActivity:

ParamètresActivité.Java:

public class SettingsActivity extends AppCompatPreferenceActivity {

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

    // I'm displaying a fragment as the main content.
    getFragmentManager().beginTransaction()
            .replace(Android.R.id.content, new GeneralPreferenceFragment())
            .commit();

    setupActionBar();

}


private void setupActionBar() {

    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);


}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    int id = item.getItemId();
    if (id == Android.R.id.home) {
        if (!super.onMenuItemSelected(featureId, item)) {
            NavUtils.navigateUpFromSameTask(this);
        }
        return true;
    }
    return super.onMenuItemSelected(featureId, item);
}
...
1
Melly Button