Bagaimana cara menambahkan tombol ke PreferenceScreen?

137

Saya cukup baru dalam Pengembangan Android dan baru saja menemukan Preferensi. Saya menemukan PreferenceScreendan ingin membuat fungsi login dengannya. Satu-satunya masalah yang saya miliki adalah saya tidak tahu bagaimana saya bisa menambahkan tombol "Masuk" ke PreferenceScreen.

Inilah PreferenceScreenpenampilan saya :

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

Tombol harus tepat di bawah dua EditTextPreferences.

Apakah ada solusi sederhana untuk masalah ini? Solusi satu yang saya temukan tidak berfungsi karena saya menggunakan sub PreferenceScreens.

Memperbarui:

Saya menemukan bahwa saya dapat menambahkan tombol dengan cara ini:

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

dan file layout ( loginButtons.xml) terlihat seperti itu:

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

Jadi sekarang tombolnya muncul tetapi saya tidak dapat mengaksesnya dalam kode. Saya mencobanya dengan findViewById()tetapi ini mengembalikan nol. Ada ide bagaimana saya bisa mengakses tombol-tombol ini?

Van Naaktgeboren
sumber
Lihat pertanyaan ini stackoverflow.com/questions/2697233/…
Juozas Kontvainis
2
BTW, jawaban @neelabh paling sederhana - Anda dapat mencapai perilaku yang diperlukan dengan menentukan event hanlder di xml-layout: cukup tambahkan android:onClick="method"ke setiap tombol, di mana metode didefinisikan dalam aktivitas sebagai public void method(View v).
Stan

Jawaban:

310

Untuk xml:

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

Kemudian untuk java di file 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;
    }
});

Ini akan muncul seperti Preferensi normal, hanya dengan judul dan ringkasan, sehingga akan terlihat seperti miliknya.

Buluh
sumber
7
Banyak dari aplikasi Google yang sudah dimuat sebelumnya menggunakan pendekatan ini, dan karenanya adalah ide yang bagus untuk mengikutinya! Saya menemukan tombol abu-abu standar terlihat tidak pada tempatnya pada layar preferensi, dan berkat Anda, saya menemukan cara yang bagus untuk membuatnya terlihat standar :)
Tom
5
Pastikan itu android:key="key"dan findPreference("key");menggunakan kunci yang sama.
Reed
4
sebenarnya ini tidak menampilkan tombol sama sekali, yang akan membingungkan pengguna dan bukan yang diminta OP. jawaban yang benar untuk benar-benar menampilkan tombol adalah milik Nicolas.
berubah2112
7
Saya baru menyadari bahwa saya memposting ini pada tahun 2011 pada 1:11. Ha ha.
Reed
3
Seharusnya melakukannya 1 bulan dan 11 hari kemudian:
11/1
44

Saya suppouse sudah terlambat. Inilah yang telah saya lakukan untuk Preferensi Tombol.

Preferensi dalam file preference.xml di folder xml

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

dan pref_reset_bd_button.xml di folder tata letak

 <?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
sumber
android:widgetLayoutadalah koneksi sempurna antara fragmen dan dan preferensi (satu atau keduanya didefinisikan dalam XML). Terima kasih banyak. Di sini
peter_the_oak
Hai @Nicolas. Kode Anda berfungsi, tetapi satu pertanyaan ... Bagaimana Anda dapat melakukannya tombol berfungsi di kelas yang memperluas PreferenceActivity
SP
4
Tolong beritahu saya bagaimana menemukan tombol ini dengan id "resetButton" terima kasih!
Ben Jima
Saya menemukan menggunakan android: layout lebih unggul dari android: widgetLayout. Menggunakan widgetLayout, tombol saya menjadi apa yang hanya bisa saya gambarkan sebagai layout_alignParentRight = "true", tetapi perilaku itu hilang saat menggunakan android: layout sebagai gantinya
JoeHz
1
Dan saya tidak bisa mengaktifkan ini untuk mengaktifkan penanganan kejadian onPreferenceChange atau Click
JoeHz
38

Saya ingin menambahkan tautan Keluar ke preferensi dan dapat memodifikasi kode Jakar agar berfungsi seperti ini:

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

Awalnya 'Preferensi' adalah 'EditTextPreference' yang saya edit sendiri.

Kemudian di kelas:

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
sumber
3
Bekerja dengan baik. Itu brilian!
RRTW
8

Menambahkan

setContentView(R.layout.buttonLayout);

Di bawah

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>

Tombol Akses oleh:

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

Anda bisa mendapatkan tombol di atas atau di bawah layar dengan meletakkan tombol di RelativeLayout:

  • top_control_bar
  • bottom_control_bar

bottom_control_bar

Ini berhasil untuk saya. Saya harap saya dapat membantu seseorang dengan potongan kode ini.

Thijs Limmen
sumber
Saya menggunakan ini di aplikasi saya, ini membuat tombol di atas daftar yang terlihat lebih baik dan lebih ramah pengguna untuk tombol OK dan Batal. Terima kasih.
Grux
1

Menurut saya tidak ada cara mudah untuk menambahkan Tombol ke layar preferensi. Preferensi terbatas pada:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

Saat menggunakan layar preferensi, Anda dibatasi pada penggunaan opsi-opsi ini, dan tidak ada satu "preferensi tombol" yang dapat dengan mudah digunakan untuk kebutuhan Anda.

Saya telah mencari fungsi serupa, dengan menambahkan tombol ke layar preferensi, tetapi sepertinya Anda perlu membuat layar sendiri untuk ini, mengelola perubahan ke preferensi dalam implementasi Anda sendiri.

Eric Nordvik
sumber
Memiliki masalah yang sama, Jika Anda menginginkan tombol dalam preferensi Anda, Anda harus menggunakan layar pref buatan sendiri :(
Janusz
1

Anda dapat melakukannya seperti ini untuk mengakses tombol!

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

Jangan lupa untuk menambahkan android:idke LinearLayout yang berisi tombol di layoutButtons.xml , yaitu 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!
Shah
sumber
Jangan lupa untuk menandai pertanyaan ini BENAR jika Anda merasa saya membantu Anda di dalamnya?
Shah
1

Jika Anda ingin mendapatkan pengguna mengklik salah satu item Preferensi dan aplikasi Anda sedang menggunakan PreferenceFragmentCompat, maka Anda dapat melakukan ini:

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

Anda juga dapat menyesuaikan tata letak Preferensi dengan mengganti Preference.onCreateView(parent). Contoh di bawah ini menggunakan kelas dalam anonim untuk membuat preferensi berwarna merah.

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

Anda dapat menggunakan teknik ini untuk menambahkan tombol ke tampilan default.

Roger Keays
sumber
0

Buat tata letak kustom untuk SettingsFragment.javayaitulayout_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>

Kemudian, lihat file tata letak di 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>

Dan kemudian, dalam onViewCreated()metode Anda SettingsFragment.java, Anda dapat menggunakan tombol seperti ini:

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

Contoh Layar Pengaturan dengan Tombol

cgb_pandey
sumber
-1

try android: onClick = "myMethod" berfungsi seperti pesona untuk acara onclick sederhana

neelabh
sumber
4
Preferencetidak memiliki onClickproperti
ercan
Jawabannya tersirat android:onClickdalam tampilan tombol terlampir, bukan dalam preferensi itu sendiri.
Stan