Jak dodać przycisk do PreferenceScreen?

135

Jestem całkiem nowy w programowaniu na Androida i właśnie natknąłem się na Preferencje. Znalazłem PreferenceScreeni chciałem stworzyć za jego pomocą funkcję logowania. Jedyny problem, jaki mam, to to, że nie wiem, jak dodać przycisk „Zaloguj się” do pliku PreferenceScreen.

Oto jak PreferenceScreenwygląda mój :

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

Przycisk powinien znajdować się tuż pod dwoma EditTextPreferenceliterami.

Czy istnieje proste rozwiązanie tego problemu? Jedyne rozwiązanie, które znalazłem, nie działa, ponieważ używam subs PreferenceScreen.

Aktualizacja:

Odkryłem, że mogę dodać przyciski w ten sposób:

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

a plik układu ( loginButtons.xml) wygląda następująco:

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

Teraz pojawiają się przyciski, ale nie mogę uzyskać do nich dostępu w kodzie. Próbowałem, findViewById()ale to zwraca wartość null. Jakieś pomysły, jak mogę uzyskać dostęp do tych przycisków?

Van Naaktgeboren
źródło
Spójrz na to pytanie stackoverflow.com/questions/2697233/…
Juozas Kontvainis
2
Przy okazji, odpowiedź @neelabh jest najprostsza - możesz osiągnąć wymagane zachowanie, określając obsługę zdarzeń w układzie xml: po prostu dodaj android:onClick="method"do każdego przycisku, gdzie metoda jest zdefiniowana w działaniu jako public void method(View v).
Stan

Odpowiedzi:

304

W przypadku XML:

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

Następnie dla javy w twoim 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;
                }
            });

Będzie wyglądać jak normalne preferencje, z tylko tytułem i podsumowaniem, więc będzie wyglądać, jakby należało.

Edycja: przestawiłem się na używanie @string/myCoolButtoni, getString(R.string.myCoolButton)ponieważ najlepiej jest używać zasobów do pomocy kompilatora, tłumaczenia języków i łatwości zmian w ciągach.

Trzcina
źródło
7
Wiele wstępnie załadowanych aplikacji Google korzysta z tego podejścia, dlatego warto go przestrzegać! Znalazłem standardowy szary przycisk, który wygląda nie na miejscu na ekranie preferencji, a dzięki Tobie znalazłem fajny sposób na ujednolicenie go :)
Tom
5
Upewnij się, że android:key="key"i findPreference("key");używasz tego samego klucza.
Reed
4
w rzeczywistości nie wyświetla to w ogóle przycisku, co zmyli użytkownika i nie jest tym, o co prosił OP. Prawidłowa odpowiedź, aby faktycznie pokazać przycisk, to Nicolas.
mutable2112
7
Właśnie zauważyłem, że opublikowałem to w 2011 o 1:11. Ha ha.
Reed
3
Powinienem był to zrobić 1 miesiąc i 11 dni później: 11/1 / '11 - 1:11 :)
P Kuijpers
43

Przypuszczam, że jest za późno. Oto, co zrobiłem dla preferencji przycisków.

Preferencja w pliku preference.xml w folderze xml

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

i pref_reset_bd_button.xml w folderze układu

 <?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>
Nicolas
źródło
android:widgetLayoutto idealne połączenie między fragmentami i preferencjami (jedną lub obie zdefiniowane w XML). Wielkie dzięki. Tutaj
peter_the_oak
Cześć @Nicolas. Twój kod działa, ale jedno pytanie ... Jak możesz to zrobić, aby przycisk działał w klasie, która rozszerza PreferenceActivity
SP
4
Powiedz mi, jak znaleźć ten przycisk z identyfikatorem „resetButton”, dzięki!
Ben Jima
Znalazłem za pomocą android: layout lepszy od android: widgetLayout. Korzystając z widgetLayout, mój przycisk stał się tym, co mogę opisać tylko jako layout_alignParentRight = "true", ale to zachowanie
zniknęło,
1
I nie mogę tego zrobić, aby uruchomić procedurę obsługi zdarzeń onPreferenceChange lub Click
JoeHz,
38

Chciałem dodać link Zakończ do preferencji i mogłem zmodyfikować kod Jakara, aby działał w następujący sposób:

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

Pierwotnie „Preference” to „EditTextPreference”, które ręcznie edytowałem.

Następnie w klasie:

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;
            }
        });     
    }
}
}
Dunfield
źródło
3
Działa świetnie. To wspaniale!
RRTW
8

Dodaj

setContentView(R.layout.buttonLayout);

Poniżej

addPreferencesFromResource(R.xml.yourPreference);

układ przycisków:

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

Przycisk dostępu według:

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

Możesz umieścić przycisk na górze lub na dole ekranu, umieszczając go w RelativeLayout:

  • top_control_bar
  • bottom_control_bar

bottom_control_bar

To zadziałało dla mnie. Mam nadzieję, że mogę komuś pomóc z tym fragmentem kodu.

Thijs Limmen
źródło
Użyłem tego w mojej aplikacji, utrzymuje przycisk na górze listy, który wygląda lepiej i jest bardziej przyjazny dla użytkownika dla przycisków OK i Anuluj. Dziękuję Ci.
Grux
1

Nie sądzę, że istnieje łatwy sposób na dodanie przycisku do ekranu preferencji. Preferencje są ograniczone do:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

Korzystając z ekranu preferencji, jesteś ograniczony do korzystania z tych opcji i nie ma jednego „preferencji przycisku”, którego można by łatwo użyć według własnych potrzeb.

Szukałem podobnej funkcjonalności, dodając przyciski do ekranu preferencji, ale wydaje się, że musisz zbudować własny ekran, aby zarządzać zmianą preferencji we własnej implementacji.

Eric Nordvik
źródło
Miałeś ten sam problem, jeśli chcesz mieć przycisk w swoich preferencjach, musisz użyć samodzielnie wykonanego ekranu wstępnego :(
Janusz
1

Możesz to zrobić w ten sposób, aby uzyskać dostęp do przycisku!

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

Nie zapomnij dodać android:iddo LinearLayout, który zawiera przycisk w layoutButtons.xml , tj 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!
Szach w persji
źródło
nie zapomnij oznaczyć tego pytania jako PRAWDA, jeśli czujesz, że pomogłem ci w tym?
Shah
0

Możesz również dostosować układ preferencji, zastępując Preference.onCreateView(parent). Poniższy przykład używa anonimowej klasy wewnętrznej, aby określić preferencje koloru czerwonego.

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

Możesz użyć tej techniki, aby dodać przycisk do widoku domyślnego.

Roger Keays
źródło
0

Jeśli ktoś poleci użytkownikowi kliknięcie jednego z elementów Preferencji i uchwytów, które klikają i na których opiera się Twoje rozwiązanie PreferenceFragmentCompat, możesz to zrobić:

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

Jawa:

@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
}
Csaba Toth
źródło
0

Utwórz niestandardowy układ dla SettingsFragment.javanplayout_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>

Następnie zapoznaj się z plikiem układu w 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>

A następnie, w swojej onViewCreated()metodzie SettingsFragment.java, możesz użyć przycisku w ten sposób:

    @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();
            }
        });
    }

Przykładowy ekran ustawień z przyciskiem

cgb_pandey
źródło
-1

try android: onClick = "myMethod" działa jak ozdoba dla prostych zdarzeń onclick

neelabh
źródło
4
Preferencenie ma onClicknieruchomości
ercan
Odpowiedź sugeruje android:onClickw załączonym widoku przycisku, a nie w samej preferencji.
Stan