web-dev-qa-db-fra.com

Comment ajouter un bouton à PreferenceScreen

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?

106
vlaku

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.

248
Max

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.

56
jpihl

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
| +--
+--
11
Ronnie

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; 
    } 
}
7
vlaku

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

 enter image description here

2
Albert
 <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.

1
Mejonzhan

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
}
1
user507410

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>
1
redevill

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");
        }
}
0
Ankit Singh

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.

0
iaindownie

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");
}
}
0
ppareit

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) {
                ...
            }
    }

}
0
Dmitry