PreferenceScreen'e düğme nasıl eklenir?


135

Android Geliştirmede oldukça yeniyim ve Tercihler ile tanıştım. Onunla PreferenceScreenbir giriş işlevi buldum ve oluşturmak istedim. Sahip olduğum tek sorun, "Giriş" düğmesini nasıl ekleyebileceğimi bilmemem PreferenceScreen.

İşte benim PreferenceScreengibi görünüyor:

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

Düğme iki EditTextPreferences'nin hemen altında olmalıdır .

Bu sorunun basit bir çözümü var mı? Bulduğum tek çözüm işe yaramadı çünkü sub PreferenceScreens kullandım .

Güncelleme:

Düğmeleri bu şekilde ekleyebileceğimi anladım:

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

ve düzen dosyası ( loginButtons.xml) şu şekilde görünür:

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

Şimdi düğmeler görünüyor ama kodla erişemiyorum. İle denedim findViewById()ama bu null döndürüyor. Bu düğmelere nasıl erişebileceğim hakkında bir fikrin var mı?



2
BTW, @neelabh yanıtı en basittir - xml düzeninde event hanlder öğesini belirterek gerekli davranışı elde edebilirsiniz: android:onClick="method"yöntemde etkinlik olarak tanımlanmış olan her düğmeye ekleyin public void method(View v).
Stan

Yanıtlar:


304

Xml için:

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

Sonra java için 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;
                }
            });

Bu, yalnızca bir başlık ve bir özetle normal bir Tercih gibi görünecektir, bu yüzden ait olduğu gibi görünecektir.

Düzenleme: Ben kullanmaya değiştirdim @string/myCoolButtonve getString(R.string.myCoolButton)derleyici yardımı, dil çevirisi ve Dize değişikliklerinin kolaylığı için kaynakları kullanmak en iyisidir.


7
Önceden yüklenmiş google uygulamalarının çoğu bu yaklaşımı kullanır ve bu nedenle bunu takip etmek iyi bir fikirdir! Standart bir gri düğmenin tercihler ekranında yerinden çıktığını gördüm ve sizin sayenizde standart görünmesini sağlamanın güzel bir yolunu buldum :)
Tom

5
Emin olun android:key="key"ve findPreference("key");aynı anahtarı kullanıyor.
Reed,

4
aslında bu bir düğmeyi göstermez, bu da kullanıcının kafasını karıştırır ve OP'nin istediği gibi değildir. aslında bir düğmeyi göstermek için doğru cevap Nicolas's.
mutable2112

7
Bunu 2011'de 1:11'de yayınladığımı fark ettim. Haha.
Reed

3
Bunu 1 ay ve 11 gün sonra
yapmalıydım: 11/1

43

Sanırım çok geç. Bu bir Düğme Tercihi için yaptım.

Xml klasöründeki preference.xml dosyasındaki tercih

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

ve düzen klasöründe pref_reset_bd_button.xml

 <?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:widgetLayoutfragmanlar ve ve tercihler (XML'de tanımlanan bir veya her ikisi) arasındaki mükemmel bağlantıdır. Çok teşekkürler. Burada
peter_the_oak

Merhaba @Nicolas. Kodunuz iş, ama bir soru ... Eğer düğme PreferenceActivity uzanan bir sınıfta çalıştığını nasıl yapabilirim
SP

4
Lütfen bana bu butonu nasıl bulacağınızı söyleyin "resetButton" teşekkürler!
Ben Jima

Android: widgetLayout'tan daha üstün android: düzen kullanarak buldum. WidgetLayout'u kullanarak, düğmem yalnızca layout_alignParentRight = "true" olarak tanımlayabildiğim şey oldu, ancak bu davranış android kullanırken kullanıldı: düzen yerine
JoeHz

1
Ve bunu bir onPreferenceChange veya Click olay işleyicisini
ateşleyemiyorum

38

Tercihlere bir Çıkış bağlantısı eklemek istedim ve Jakar'ın kodunu şu şekilde çalışmasını sağlamak için değiştirebildim:

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

Başlangıçta 'Tercih' düzenlediğim bir 'EditTextPreference' idi.

Sonra sınıfta:

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
Harika çalışıyor. Harika!
RRTW

8

Ekle

setContentView(R.layout.buttonLayout);

Altında

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>

Erişim Düğmesi:

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

Düğmeyi RelativeLayout'a yerleştirerek düğmeyi ekranın üstüne veya altına alabilirsiniz:

  • top_control_bar
  • bottom_control_bar

bottom_control_bar

Bu benim için çalıştı. Umarım bu kodla birisine yardım edebilirim.


Uygulamamda bunu kullandım, düğmeyi daha iyi görünen ve Tamam ve İptal düğmeleri için daha kullanıcı dostu olan listenin üstünde tutar. Teşekkür ederim.
Grux

1

Tercih ekranına sadece bir Düğme eklemenin kolay bir yolu olduğunu düşünmüyorum. Tercihler aşağıdakilerle sınırlıdır:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

Bir tercih ekranı kullanırken, bu seçeneklerin kullanımı ile sınırlandırılırsınız ve ihtiyaçlarınız için kolayca kullanılabilecek tek bir "düğme tercihi" yoktur.

Tercih ekranına düğme ekleyerek benzer işlevler arıyordum, ancak bunun için kendi ekranınızı oluşturmanız, kendi uygulamanızdaki tercihlerdeki değişikliği yönetmeniz gerekiyor gibi görünüyor.


Aynı sorun vardı, Tercihlerinizde bir düğme istiyorsanız, kendi kendine yapılan bir ön ekran kullanmanız gerekir :(
Janusz

1

Düğmeye erişmek için bunu yapabilirsiniz!

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

Eklemeyi unutmayın android:iddüğmesini içeren LinearLayout için layoutButtons.xml , yani 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!

u içinde yardımcı oldu hissediyorum eğer bu soru DOĞRU olarak işaretlemek unutmayın?
Şah

0

Ayrıca bir Tercih düzenini geçersiz kılarak da özelleştirebilirsiniz Preference.onCreateView(parent). Aşağıdaki örnek, kırmızı tercihler yapmak için anonim bir iç sınıf kullanır.

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

Varsayılan görünüme bir düğme eklemek için bu tekniği kullanabilirsiniz.


0

Birisi kullanıcıya, tıklayan Tercihler öğelerinden ve tutamaçlarından birini tıklatması talimatını verirse ve çözümünüz temel alıyorsa PreferenceFragmentCompat, bunu yapabilirsiniz:

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

Java:

@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

İçin özel bir düzen oluşturma SettingsFragment.javayanilayout_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>

Ardından, aşağıdakilerdeki düzen dosyasına bakın 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>

Ve sonra, onViewCreated()yönteminizde SettingsFragment.javadüğmeyi şu şekilde kullanabilirsiniz:

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

Düğmeli Örnek Ayarlar Ekranı


-1

android'i dene: onClick = "myMethod" basit onclick etkinlikleri için cazibe gibi çalışır


4
Preferencehayır vardır onClicközelliğini
ercan

Yanıt android:onClick, tercihin kendisinde değil ekteki düğme görünümünde ima edilir.
Stan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.