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.
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
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>
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>
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" />
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!
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.
Au lieu de:
public class PreferencesActivity extends Activity
Faire ceci:
public class PreferencesActivity extends AppCompatActivity