web-dev-qa-db-fra.com

Comment ajouter une barre d'outils dans PreferenceActivity?

Je souhaite ajouter ToolBar à PreferenceActivity dans mon application Android. J'ai écrit le code suivant.

  public class SettingsActivity extends PreferenceActivity  {
 SendSMS sms;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.settings);
    LinearLayout root = (LinearLayout)findViewById(Android.R.id.list).getParent().getParent().getParent();
    Android.support.v7.widget.Toolbar bar = (Android.support.v7.widget.Toolbar) LayoutInflater.from(this).inflate(R.layout.action_bar_setting, root, false);
    root.addView(bar, 0);
    bar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });

}

Cela fonctionnait parfaitement dans mon API Android KitKat phone 19 mais la fermeture forcée dans le niveau 10 de l’API c.-à-d. Pain d’épice . S'il vous plaît me suggérer.

14
Tek Raj

Vous avez besoin d'une mise en page contenant une Toolbar et une ListView avec Android:id="@Android:id/list"

activity_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@id/content_frame"
    Android:orientation="vertical" Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <Android.support.v7.widget.Toolbar
        Android:id="@id/toolbar"
        Android:layout_height="wrap_content"
        Android:layout_width="match_parent"
        Android:minHeight="?attr/actionBarSize"
        Android:background="?attr/colorPrimary" />
    <ListView
        Android:id="@Android:id/list"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />
</LinearLayout>

SettingsActivity.Java

public class SettingsActivity extends PreferenceActivity {

    private AppCompatDelegate mDelegate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getDelegate().installViewFactory();
        getDelegate().onCreate(savedInstanceState);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
        addPreferencesFromResource(R.xml.preferences);
        ...
    }

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

    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        getDelegate().setContentView(layoutResID);
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        getDelegate().onPostResume();
    }

    @Override
    protected void onStop() {
        super.onStop();
        getDelegate().onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getDelegate().onDestroy();
    }

    private void setSupportActionBar(@Nullable Toolbar toolbar) {
        getDelegate().setSupportActionBar(toolbar);
    }

    private AppCompatDelegate getDelegate() {
        if (mDelegate == null) {
            mDelegate = AppCompatDelegate.create(this, null);
        }
        return mDelegate;
    }
    ...
}

Découvrez mon exemple pleinement fonctionnel:

Référence de l'équipe Android: AppCompatPreferenceActivity

31
hidro

Essayer:

public class SettingsActivity extends AppCompatPreferenceActivity {
.....

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

    //addPreferencesFromResource(R.xml.pref_general);        
}

private void setupActionBar() {
    ViewGroup rootView = (ViewGroup)findViewById(R.id.action_bar_root); //id from appcompat

    if (rootView != null) {
        View view = getLayoutInflater().inflate(R.layout.app_bar_layout, rootView, false);
        rootView.addView(view, 0);

        Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }

    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        // Show the Up button in the action bar.
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

app_bar_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.AppBarLayout
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:theme="@style/AppTheme.AppBarOverlay">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="?attr/actionBarSize"
        Android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay"/>

</Android.support.design.widget.AppBarLayout>
8
ilw

Vous pouvez facilement ajouter une barre d’outils à partir de @Android:style/Theme.Material.Light.DarkActionBar

Dans AndroidManifest.xml

<activity
    Android:name=".activity.SettingsActivity"
    Android:theme="@style/SettingsTheme"
    Android:label="Settings"/>

Dans v21/styles.xml

<style name="SettingsTheme" parent="@Android:style/Theme.Material.Light.DarkActionBar">
<item name="Android:colorPrimary">@color/colorPrimary</item>
<item name="Android:colorPrimaryDark">@color/colorPrimaryDark</item>

Dans v14/styles.xml pour la prise en charge de Back API

<style name="SettingsTheme" parent="@Android:style/Theme.Holo.Light.DarkActionBar">
<item name="Android:actionBarStyle">@style/ActionBar.V14.Movie.NoTitle</item>

3
opticod

Très facile et fonctionne bien dans mon cas en gonflant la barre d’outils personnalisée . Dans votre code Java, faites comme ci-dessous,

   public class SettingsPrefActivity extends AppCompatPreferenceActivity {
        //  private static final String TAG = SettingsPrefActivity.class.getSimpleName();

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

            //setting up toolbar
            getLayoutInflater().inflate(R.layout.toolbar_setting, (ViewGroup) findViewById(Android.R.id.content));
            Toolbar toolbar = findViewById(R.id.toolbar);
            toolbar.setTitle("Settings");
            setSupportActionBars(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);

            // load settings fragment
            getFragmentManager().beginTransaction().replace(Android.R.id.content, new MainPreferenceFragment()).commit();
        }

    }

et à votre code côté xml, ajoutez une catégorie de préférence en haut, comme ci-dessous,

  <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
//put below line at the top of your xml preference layout screen..
    <PreferenceCategory Android:layout="@layout/toolbar_setting"></PreferenceCategory>

et dans votre dossier de ressources de présentation toolbar_setting,

   <?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:local="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="?attr/colorPrimary"
    Android:elevation="@dimen/appbar_elevation"
    Android:minHeight="?attr/actionBarSize"
    Android:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
2
Hiren

Je suis en retard, mais voici une petite solution au problème au lieu d'écrire des tonnes de code ou d'ajouter des bibliothèques volumineuses.

Allez à AndroidManifest.xml et à votre activité de préférence, ajoutez la personnalisation theme

 <activity
        Android:name=".Dashboard.PreferencepActivity"
        Android:label="@string/title_activity_preference"
        Android:theme="@style/Pref"></activity>

Voici le thème personnalisé ajouté au @style/Pref ci-dessus

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

J'espère que ça aide!

1
silverFoxA

Cette méthode ne résoudra pas l'ajout de la barre d'outils, mais vous pouvez récupérer la valeur par défaut ActionBar pour votre page de paramètres. Créez un thème pour l'activité de paramétrage en héritant du thème parent.

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

<style name="AppTheme.Settings" parent="AppTheme">
    <item name="windowNoTitle">false</item>
    <item name="windowActionBar">true</item>
</style>

Dans AndroidManifest.xml, définissez le Android:theme

<activity
    Android:name=".Settings"
    Android:theme="@style/AppTheme.Settings" />

C'est tout.

0
Ugokoli

Au lieu de:

public class PreferencesActivity extends Activity

Faire ceci:

public class PreferencesActivity extends AppCompatActivity
0
Darush