149 votes

Comment ajouter un bouton à un PreferenceScreen ?

Je suis assez novice en matière de développement Android et je viens de découvrir les préférences. J'ai trouvé PreferenceScreen et je voulais créer une fonctionnalité de connexion avec elle. Le seul problème que j'ai, c'est que je ne sais pas comment ajouter un bouton "Connexion" à la page d'accueil. PreferenceScreen .

Voici ce que mon PreferenceScreen ressemble :

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
...
    <PreferenceScreen android:title="@string/login" android:key="Login">
        <EditTextPreference android:persistent="true" android:title="@string/username" android:key="Username"></EditTextPreference>
        <EditTextPreference android:title="@string/password" android:persistent="true" android:password="true" android:key="Password"></EditTextPreference>
    </PreferenceScreen>
...
</PreferenceScreen>

Le bouton doit se trouver juste en dessous des deux EditTextPreference s.

Existe-t-il une solution simple pour ce problème ? La seule solution que j'ai trouvée ne fonctionne pas parce que j'utilise des sub PreferenceScreen s.

Mise à jour :

J'ai découvert que je pouvais ajouter des boutons de cette façon :

<PreferenceScreen android:title="@string/login" android:key="Login">
        <EditTextPreference android:persistent="true" android:title="@string/username" android:key="Username"></EditTextPreference>
        <EditTextPreference android:title="@string/password" android:persistent="true" android:password="true" android:key="Password"></EditTextPreference>
        <Preference android:layout="@layout/loginButtons" android:key="loginButtons"></Preference>
</PreferenceScreen>

et le fichier de mise en page ( loginButtons.xml ) ressemble à ça :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:weightSum="10" 
    android:baselineAligned="false" android:orientation="horizontal">
    <Button android:text="Login" android:layout_width="fill_parent"
        android:layout_weight="5" android:layout_height="wrap_content"
        android:id="@+id/loginButton" android:layout_gravity="left"></Button>
    <Button android:text="Password?" android:layout_width="fill_parent"
        android:layout_weight="5" android:layout_height="wrap_content"
        android:id="@+id/forgottenPasswordButton"></Button>
</LinearLayout>

Donc maintenant les boutons apparaissent mais je ne peux pas y accéder en code. J'ai essayé avec findViewById() mais il renvoie un résultat nul. Avez-vous une idée de la façon dont je pourrais accéder à ces boutons ?

0 votes

Regardez cette question stackoverflow.com/questions/2697233/

2 votes

BTW, la réponse de @neelabh est très simple - vous pouvez obtenir le comportement requis en spécifiant l'hanlder d'événement dans le xml-layout : ajoutez simplement android:onClick="method" à chaque bouton, la méthode étant définie dans l'activité comme suit public void method(View v) .

332voto

Jakar Points 6267

Pour le xml :

<Preference
    android:title="Acts like a button"
    android:key="@string/myCoolButton"
    android:summary="This is a cool button"
/>

Ensuite, pour le java dans votre onCreate()

Preference button = findPreference(getString(R.string.myCoolButton));
button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) { 
        //code for what you want it to do 
        return true;
    }
});

Cela apparaîtra comme une préférence normale, avec juste un titre et un résumé, de sorte qu'il apparaîtra comme il se doit.

8 votes

De nombreuses applications google préchargées utilisent cette approche, et c'est donc une bonne idée de la suivre ! J'ai trouvé qu'un bouton gris standard n'avait pas sa place sur un écran de préférences, et grâce à vous, j'ai trouvé une bonne façon de le faire paraître standardisé :)

0 votes

@Jakar Cela ne semble pas fonctionner pour moi, 2.3.3. Il jette une exception de pointeur nul parce que findPreference() renvoie la nullité

5 votes

Assurez-vous que android:key="key" y findPreference("key"); utilisent la même clé.

38voto

Dunfield Points 241

Je voulais ajouter un lien de sortie aux préférences et j'ai pu modifier le code de Jakar pour qu'il fonctionne comme ceci :

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >   
   <PreferenceCategory android:title="Settings">
       <Preference android:title="Click to exit" android:key="exitlink"/>       
   </PreferenceCategory>    
</PreferenceScreen>

À l'origine, la "préférence" était une "EditTextPreference" que j'ai modifiée à la main.

Puis dans la classe :

public class MyPreferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.mypreferences);

    Preference button = (Preference)getPreferenceManager().findPreference("exitlink");      
    if (button != null) {
        button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference arg0) {
                finish();   
                return true;
            }
        });     
    }
}
}

3 votes

Ca marche très bien. C'est génial !

8voto

Thijs Limmen Points 104

Ajouter

setContentView(R.layout.buttonLayout);

En dessous de

addPreferencesFromResource(R.xml.yourPreference);

buttonLayout :

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<RelativeLayout
        android:id="@+id/top_control_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
</RelativeLayout>

<LinearLayout
        android:id="@+id/bottom_control_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">

    <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:text="@string/saveAlarm"/>
</LinearLayout>

<ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_above="@id/bottom_control_bar"
        android:layout_below="@id/top_control_bar"
        android:choiceMode="multipleChoice">
</ListView>

Bouton d'accès par :

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        //Your event
    }
});

Vous pouvez placer le bouton en haut ou en bas de l'écran en le plaçant dans RelativeLayout :

  • barre_de_contrôle_supérieure
  • barre de contrôle inférieure

barre de contrôle inférieure

Cela a fonctionné pour moi. J'espère pouvoir aider quelqu'un avec ce morceau de code.

0 votes

Je l'ai utilisé dans mon application, il maintient le bouton en haut de la liste, ce qui est plus esthétique et plus convivial pour les boutons OK et Annuler. Merci.

1voto

sHaH.. Points 1765

Vous pouvez le faire comme ceci pour accéder au bouton !

 View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.layoutButtons, null, false);

N'oubliez pas d'ajouter android:id à la LinearLayout qui contient le bouton en layoutButtons.xml c'est-à-dire android:id="@+id/mylayout"

 LinearLayout mLayout = (LinearLayout) footerView.findViewById(R.id.mylayout);
 Button login = (Button) footerView.findViewById(R.id.loginButton);
 login.setOnClickListener(this);
 ListView lv = (ListView) findViewById(android.R.id.list);
 lv.addFooterView(footerView);

 // Lines 2 and 3 can be used in the same way for a second Button!

0 votes

N'oubliez pas de marquer cette question comme VRAIE si vous pensez que je vous ai aidé ?

-2voto

neelabh Points 145

Essayer Android:onClick="myMethod" fonctionne comme un charme pour les événements onclick simples

4 votes

Preference n'a pas onClick propriété

0 votes

La réponse implique android:onClick dans la vue du bouton joint, et non dans la préférence elle-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X