Come aggiungere un pulsante a una PreferenceScreen?


135

Sono abbastanza nuovo per lo sviluppo di Android e mi sono appena imbattuto in Preferenze. Ho trovato PreferenceScreene voluto creare una funzionalità di accesso con esso. L'unico problema che ho è che non so come potrei aggiungere un pulsante "Login" al PreferenceScreen.

Ecco PreferenceScreencome appare il mio :

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

Il pulsante dovrebbe essere proprio sotto le due EditTextPreferences.

C'è una soluzione semplice per questo problema? L'unica soluzione che ho trovato non funzionava perché utilizzo i sub PreferenceScreen.

Aggiornare:

Ho capito che posso aggiungere pulsanti in questo modo:

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

e il file di layout ( loginButtons.xml) appare così:

<?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>

Quindi ora appaiono i pulsanti ma non riesco ad accedervi nel codice. L'ho provato con findViewById()ma questo sta restituendo null. Qualche idea su come potrei accedere a questi pulsanti?



2
A proposito, la risposta di @neelabh è molto semplice: puoi ottenere il comportamento richiesto specificando il hanlder di eventi nel layout xml: basta aggiungere android:onClick="method"a ciascun pulsante, dove il metodo è definito nell'attività come public void method(View v).
Stan,

Risposte:


304

Per l'xml:

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

Quindi per il java nel tuo 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;
                }
            });

Apparirà come una normale preferenza, con solo un titolo e un riepilogo, quindi sembrerà che appartenga.

Modifica: sono passato all'utilizzo @string/myCoolButtone getString(R.string.myCoolButton)perché è meglio utilizzare le risorse per l'assistenza del compilatore, la traduzione della lingua e la facilità delle modifiche alle stringhe.


7
Molte delle app google precaricate utilizzano questo approccio, quindi è una buona idea seguirlo! Ho trovato un pulsante grigio standard che sembra fuori posto nella schermata delle preferenze e grazie a te ho trovato un modo carino per renderlo standardizzato :)
Tom

5
Assicurarsi che android:key="key"e findPreference("key");stanno usando la stessa chiave.
Reed,

4
in realtà questo non mostra affatto un pulsante, che confonderà l'utente e non è ciò che l'OP ha chiesto. la risposta corretta per mostrare effettivamente un pulsante è di Nicolas.
mutable2112

7
Ho appena notato che l'ho pubblicato nel 2011 alle 1:11. Haha.
Reed,

3
Avrei dovuto farlo 1 mese e 11 giorni dopo: 11/1 / '11 - 1:11 :)
P Kuijpers,

43

Suppongo che sia troppo tardi. Questo è quello che ho fatto per una preferenza pulsante.

La preferenza nel file preferenza.xml nella cartella xml

....
    <Preference
        android:key="resetBD"
        android:title="@string/ajustes_almacenamiento"
        android:summary="@string/ajustes_almacenamiento_desc"
        android:widgetLayout="@layout/pref_reset_bd_button" 
    ></Preference>
  ...

e pref_reset_bd_button.xml nella cartella layout

 <?xml version="1.0" encoding="utf-8"?>
   <Button
       xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/resetButton" 
        android:text="@string/ajustes_almacenamiento_bt" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="resetearBD">

   </Button>

android:widgetLayoutè la perfetta connessione tra i frammenti e le preferenze (una o entrambe definite in XML). Molte grazie. Qui
peter_the_oak,

Ciao @Nicolas. Il tuo codice funziona, ma una domanda ... Come puoi fare che il pulsante funzioni in una classe che estende PreferenceActivity
SP

4
Per favore dimmi come trovare questo pulsante con ID "resetButton" grazie!
Ben Jima,

Ho trovato usando android: layout superiore ad android: widgetLayout. Usando widgetLayout, il mio pulsante è diventato quello che posso solo descrivere come layout_alignParentRight = "true", ma quel comportamento è andato via usando Android: layout invece
JoeHz

1
E non riesco a far sparare un gestore di eventi onPreferenceChange o Click
JoeHz il

38

Volevo aggiungere un link Exit alle preferenze e sono stato in grado di modificare il codice di Jakar per farlo funzionare in questo modo:

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

Inizialmente la "preferenza" era un "EditTextPreference" che ho modificato a mano.

Quindi in 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
Funziona alla grande. È geniale !
RRTW l'

8

Inserisci

setContentView(R.layout.buttonLayout);

Sotto

addPreferencesFromResource(R.xml.yourPreference);

disposizione dei pulsanti:

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

Pulsante di accesso per:

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

È possibile ottenere il pulsante nella parte superiore o inferiore dello schermo inserendo il pulsante in RelativeLayout:

  • top_control_bar
  • bottom_control_bar

bottom_control_bar

Questo ha funzionato per me. Spero di poter aiutare qualcuno con questo pezzo di codice.


L'ho usato nella mia app, mantiene il pulsante in cima all'elenco che sembra migliore ed è più facile da usare per i pulsanti OK e Annulla. Grazie.
Grux,

1

Non penso che ci sia un modo semplice per aggiungere un pulsante alla schermata delle preferenze. Le preferenze sono limitate a:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

Durante l'utilizzo di una schermata delle preferenze, si è limitati all'utilizzo di queste opzioni e non esistono singole "preferenze dei pulsanti" che potrebbero essere facilmente utilizzate per le proprie esigenze.

Ho cercato funzionalità simili, con l'aggiunta di pulsanti alla schermata delle preferenze, ma sembra che tu debba creare il tuo schermo per questo, gestendo la modifica delle preferenze nella tua implementazione.


Ho avuto lo stesso problema, se vuoi un pulsante tra le tue preferenze devi usare una schermata pref self made :(
Janusz

1

Puoi farlo in questo modo per accedere al pulsante!

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

Non dimenticare di aggiungere android:ida LinearLayout che contiene il pulsante in layoutButtons.xml , ad es 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!

non dimenticare di contrassegnare questa domanda come TRUE se ritieni di averti aiutato?
Shah,

0

Puoi anche personalizzare il layout di una preferenza eseguendo l'override Preference.onCreateView(parent). L'esempio seguente utilizza una classe interna anonima per creare preferenze rosse.

    screen.addPreference(
        new Preference(context) {
            @Override
            protected View onCreateView(ViewGroup parent) {
                View view = super.onCreateView(parent);
                view.setBackgroundColor(Color.RED);
                return view;
            }
        });

È possibile utilizzare questa tecnica per aggiungere un pulsante alla vista predefinita.


0

Se qualcuno viene a chiedere all'utente di fare clic su uno degli elementi Preferenze e gestisce quel clic e su cui si basa la soluzione PreferenceFragmentCompat, allora puoi farlo:

<PreferenceScreen
...
>
...
<Preference
    android:key="@string/pref_key_clickable_item"
    android:persistent="false"
    android:title="Can be clicked"
    android:summary="Click this item so stuff will happen"/>
...
</PreferenceScreen>

Giava:

@Override
onPreferenceTreeClick(Preference preference) {
    if (preference.getKey().equals(getContext().getString(R.string.pref_key_clickable_item))) {
       // user clicked the item
       // return "true" to indicate you handled the click
       return true;
    }
    return false;
}

Kotlin:

override fun onPreferenceTreeClick(preference: Preference): Boolean {
    if (preference.key == context?.getString(R.string.pref_key_clickable_ite)) {
       // user clicked the item
       // return "true" to indicate you handled the click
       return true
    }
    return false
}

0

Crea un layout personalizzato per SettingsFragment.javaielayout_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.settings.SettingsFragment"
    tools:ignore="NewApi">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBarSettings"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppBarOverlay">

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/toolbarSettings"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="?attr/actionBarSize"
            app:title="@string/fragment_title_settings" />
    </com.google.android.material.appbar.AppBarLayout>

    <!--this works as the container for the SettingsFragment.java
    put the code for the Button above or below this FrameLayout
    according to your requirement-->

    <FrameLayout
        android:id="@android:id/list_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
      app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />


    <com.google.android.material.button.MaterialButton
        android:id="@+id/btnSample"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center"
        android:text="@string/button_sample_text" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Quindi, fai riferimento al file di layout nel tuo styles.xml:

<style name="AppTheme" parent="....">
      ...............
      ...............
      <item name="preferenceTheme">@style/MyPreferenceThemeOverlay</item>
</style>

<style name="MyPreferenceThemeOverlay" parent="PreferenceThemeOverlay">
      <item name="android:layout>@layout/layout_settings</item>
</style>

E poi, nel onViewCreated()tuo metodo SettingsFragment.java, puoi usare il pulsante in questo modo:

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle 
                             savedInstanceState) {

        MaterialButton btnSample = view.findViewById(R.id.btnSample);
        btnSample.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(requireContext(), "Sample Button 
                   clicked!!", Toast.LENGTH_LONG).show();
            }
        });
    }

Schermata Impostazioni campione con pulsante


-1

provare android: onClick = "myMethod" funziona come un fascino per semplici eventi onclick


4
Preferencenon ha onClickproprietà
ercan

La risposta implica android:onClicknella vista pulsante allegata, non nella preferenza stessa.
Stan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.