Est-il possible d'ajouter un bouton au bas de l'écran des préférences et de le faire fonctionner correctement lors du défilement?
Il existe une autre solution pour personnaliser l'apparence des préférences.
Concevez une mise en page XML normale avec des boutons ou ce que vous souhaitez ajouter aux préférences standard. Incluez une ListView
dans votre mise en page et attribuez-lui l'ID @Android:id/list
.
Disons que nous appelons le fichier de mise en page res/layout/main.xml
. Cela pourrait ressembler à quelque chose comme ça:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<Button Android:text="This is a button on top of all preferences."
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
<ListView Android:id="@Android:id/list"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
</LinearLayout>
Dans votre PreferenceActivity
, ajoutez ces deux lignes à votre onCreate
:
addPreferencesFromResource(R.xml.preferences);
setContentView(R.layout.main);
La ListView
de votre mise en page sera alors remplacée par les préférences définies de la manière habituelle dans res/xml/preferences.xml
.
Je sais que c'est un peu tard, mais je viens de trouver une solution que j'aime mieux que la solution louée de Max.
Vous pouvez simplement ajouter un pied de page (ou si vous souhaitez que le bouton soit au-dessus, un en-tête) dans la liste d'affichage de PreferenceActivity, de la manière suivante:
public class MyActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
ListView v = getListView();
v.addFooterView(new Button(this));
}
}
J'espère que ça aidera quelqu'un.
Cet exemple ci-dessous affichera un bouton au bas de la page (au cas où quelqu'un serait toujours intéressé).
Dans le cas d'un LinearLayout, vous pouvez également appliquer des poids; cela est nécessaire car la liste est définie sur * fill_parent * . Je le fais généralement en ajoutant * Android: layout_weight * 's:
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical">
<ListView Android:id="@Android:id/list"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" Android:layout_weight="10"/>
<Button Android:text="This is a button on top of all preferences."
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" Android:layout_weight="1"/>
</LinearLayout>
L'explication ci-dessous n'est pas à 100%, mais elle vous aidera à comprendre ...
+-- View Port (linear layout)
| +-- List View (this is where the preferences will go)
| |
| |
| +--
+--
+--
| Button (which was pushed out of view by the fillparent of ListView
+--
Vous pouvez également dire, parce que le bouton n'a pas de poids; le bouton est rendu à une hauteur de 0dp.
Maintenant, avec le layout_weigths ajouté, le bouton sera rendu en vue
+-- View Port (linear layout)
| +-- List View (this is where the preferences will go)
| |
| |
| +--
| +--
| | Button (which was pushed out of view by the fillparent of ListView
| +--
+--
En fait, il y a une solution. Voici un code qui, je l’espère, sera utile à tout le monde ... Il ressemble à 3 options et 2 boutons en bas de l’écran, indépendamment de la résolution de l’écran (ciblé à 240 au minimum)
package com.myapplication.gui;
import Android.app.AlertDialog;
import Android.content.Context;
import Android.content.DialogInterface;
import Android.os.Bundle;
import Android.preference.Preference;
import Android.preference.PreferenceActivity;
import Android.preference.PreferenceScreen;
import Android.view.Display;
import Android.view.Gravity;
import Android.view.WindowManager;
import Android.view.ViewGroup.LayoutParams;
import Android.widget.Button;
import Android.widget.LinearLayout;
import Android.widget.ListView;
import Android.widget.ScrollView;
import com.myproject.general.HeightListView;
import com.myapplication.R;
public class FilterActivity extends PreferenceActivity {
private LinearLayout rootView;
private LinearLayout buttonView;
private Button buttonDone;
private Button buttonRevert;
private ListView preferenceView;
private LinearLayout gradientView;
private ScrollView scrollRoot;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int height = display.getHeight();
int width = height > 240 ? display.getWidth() : display.getWidth() - 4;
scrollRoot = new ScrollView(this);
scrollRoot.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
rootView = new LinearLayout(this);
rootView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
rootView.setOrientation(LinearLayout.VERTICAL);
buttonView = new LinearLayout(this);
buttonView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
buttonView.setOrientation(LinearLayout.HORIZONTAL);
buttonView.setGravity(Gravity.BOTTOM);
gradientView = new LinearLayout(this);
gradientView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
gradientView.setOrientation(LinearLayout.HORIZONTAL);
gradientView.setBackgroundResource(R.drawable.gradient);
gradientView.setPadding(0, 5, 0, 0);
gradientView.setBackgroundResource(R.drawable.gradient);
buttonDone = new Button(this);
buttonDone.setText(R.string.filterButton_Done);
buttonDone.setLayoutParams(new LayoutParams(width/2, LayoutParams.WRAP_CONTENT));
gradientView.addView(buttonDone);
buttonRevert = new Button(this);
buttonRevert.setText(R.string.filterButton_Revert);
buttonRevert.setLayoutParams(new LayoutParams(width/2, LayoutParams.WRAP_CONTENT));
gradientView.addView(buttonRevert);
buttonView.addView(gradientView);
preferenceView = new HeightListView(this);
preferenceView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
preferenceView.setId(Android.R.id.list);
PreferenceScreen screen = createPreferenceHierarchy();
screen.bind(preferenceView);
preferenceView.setAdapter(screen.getRootAdapter());
rootView.addView(preferenceView);
rootView.addView(buttonView);
if (height > 240) {
this.setContentView(rootView);
}
else {
scrollRoot.addView(rootView);
this.setContentView(scrollRoot);
}
setPreferenceScreen(screen);
}
private PreferenceScreen createPreferenceHierarchy() {
PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);
PreferenceScreen pref1 = getPreferenceManager().createPreferenceScreen(this);
pref1.setKey("pref1");
pref1.setTitle("Title");
pref1.setSummary("Summary");
root.addPreference(pref1);
PreferenceScreen pref2 = getPreferenceManager().createPreferenceScreen(this);
pref2.setKey("pref2");
pref2.setTitle("Title");
pref2.setSummary("Summary");
root.addPreference(pref2);
PreferenceScreen pref3 = getPreferenceManager().createPreferenceScreen(this);
pref3.setKey("pref3");
pref3.setTitle("Title");
pref3.setSummary("Summary");
root.addPreference(pref3);
return root;
}
}
Vous devez simplement utiliser PreferenceFragment dans l'activité générale et ajouter le bouton dans la présentation de l'activité.
public class SettingActivity extends Activity {
UserProfileViewModel userProfileViewModel = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
getFragmentManager().beginTransaction()
.replace(R.id.content, new SettingsFragment())
.commit();
}
private class SettingsFragment extends PreferenceFragment {
public SettingsFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.pref_main);
}
}
}
SettingActivity.Java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<FrameLayout
Android:id="@+id/content"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_above="@+id/buttonSave"/>
<Button
Android:id="@+id/buttonSave"
Android:text="Save"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_alignParentLeft="true"
Android:layout_alignParentStart="true" />
</RelativeLayout>
activity_setting
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<ListView
Android:id="@Android:id/list"
Android:layout_width="match_parent"
Android:layout_height="@dimens/listview_height" />
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:text="This is a button on top of all preferences." />
</RelativeLayout>
Je fais référence à @Ronnie, utilise RelativeLayout et définit une hauteur pour layout_height de listview, puis le paramètre layout_alignParentBottom = "true" du bouton. Il peut afficher un bouton au bas de PreferenceScreen; puis utilisez le chemin de @Max. cela fonctionne pour mes besoins.
Ce serait ce à quoi ressemble le code dans l'activité à l'exemple de ronny… .. Mon intention était de mettre un menu en bas de l'écran.
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.prefs);
addPreferencesFromResource(R.xml.prefs);
/* LayoutInflater CX = getLayoutInflater();
CX.inflate(R.layout.main,null);*/
// TODO Auto-generated method stub
}
Il est également possible d'ajouter des boutons d'action à la barre d'action pour une approche standard Android.
public class PrefActivity extends PreferenceActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.preference_header_menu, menu);
return super.onCreateOptionsMenu(menu);
}
}
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@+id/action_add"
Android:icon="@drawable/ic_menu_add_dark"
Android:title="@string/menu_action_add_title"
Android:showAsAction="always" />
</menu>
Vue personnalisée dans l'activité de préférence Cela vous aidera à ajouter une vue personnalisée dans PreferenceActivity sous Android.
Créez main.xml, la seule vue nécessaire est une ListView, avec l'ID: Android:id="@Android:id/list"
.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical" Android:layout_width="fill_parent"
Android:layout_height="fill_parent" Android:weightSum="1">
<ListView
Android:id="@Android:id/list"
Android:layout_weight="1"
Android:layout_width="fill_parent"
Android:layout_height="0dp">
</ListView>
<TextView
Android:id="@+id/textView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
</LinearLayout>
Créer CustomPreferenceActivity.Java
public class CustomPreferenceActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
addPreferencesFromResource(R.xml.settings);
//setup any other views that you have
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("View Added");
}
}
J'ai trouvé que toutes les réponses ci-dessus étaient inutilisables, car toutes les mises en page que j'ai créées pour "insérer" le conteneur PreferenceScreen
dans des mises en page personnalisées (puis l'ajout d'un bouton sous la ListView
) ne fonctionnaient pas.
Ils ont uniquement superposé la mise en page personnalisée en haut de la liste de préférences (flottante), et cliquer (par exemple) sur un nouveau bouton personnalisé n’invoquerait que la préférence située sous le bouton.
Cependant, j'ai trouvé cette solution qui fonctionne très bien pour l'ajout d'un bouton sous le conteneur de liste de préférences, lorsque vous utilisez PreferenceFragment
.
Voici une solution simple pour ajouter un bouton cliquable à l’écran de vos préférences. Cela est rendu facile car les préférences réservent déjà de la place dans Android: widgetLayout et le bouton peut transmettre des clics avec Android: onClick.
Commencez par créer un fichier button.xml avec le contenu.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Button
Android:text="BUTTON"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:id="@+id/button"
Android:onClick="onButtonClick"/>
</LinearLayout>
Maintenant, dans votre preferences.xml, ajoutez la préférence
<Preference
Android:key="button"
Android:title="Title"
Android:summary="Summary"
Android:widgetLayout="@layout/button" />
Votre PreferenceActivity doit maintenant contenir uniquement un membre onButtonClick
public class MainActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.main_preferences);
}
public void onButtonClick(View v) {
Log.d("Button", "Yeah, button was clicked");
}
}
preferences.xml:
<Preference
Android:key="clearAllData"
Android:title="@string/settings_clear_all_data">
</Preference>
ParamètresFragment.Java:
public class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
Preference clearAllData = (Preference) findPreference("clearAllData");
// setup buttons
final Context context = getActivity();
clearAllData.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
...
}
}
}