Як додати кнопку до екрана PreferenceScreen?


135

Я зовсім новачок у розробці Android і просто натрапив на налаштування. Я знайшов PreferenceScreenі хотів створити функціонал для входу за допомогою нього. Єдина проблема, яка у мене є, це те, що я не знаю, як я можу додати кнопку "Логін" до PreferenceScreen.

Ось як PreferenceScreenвиглядає:

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

Кнопка повинна знаходитися прямо під двома EditTextPreferences.

Чи є просте рішення цієї проблеми? Я знайшов одне рішення, що не працює, тому що я використовую sub PreferenceScreens.

Оновлення:

Я зрозумів, що я можу додавати кнопки таким чином:

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

і файл макета ( loginButtons.xml) виглядає так:

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

Отже, тепер з'являються кнопки, але я не можу отримати доступ до них у коді. Я спробував це, findViewById()але це не повертається. Будь-які ідеї, як я можу отримати доступ до цих кнопок?


Подивіться на це питання stackoverflow.com/questions/2697233 / ...
Юозас Kontvainis

2
BTW, @neelabh відповідь найпростіша - ви можете домогтися необхідної поведінки, вказавши вішалку подій у xml-макеті: просто додайте android:onClick="method"до кожної кнопки, де метод визначений у діяльності як public void method(View v).
Стен

Відповіді:


304

Для xml:

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

Тоді для java у вашому 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;
                }
            });

Це виглядатиме як звичайне налаштування, має лише назву та резюме, тож буде схоже, що належить.

Редагувати: я змінив на використання, @string/myCoolButtonі getString(R.string.myCoolButton)тому що найкраще використовувати ресурси для допомоги компілятора, перекладу мови та простоти змін рядків.


7
Багато з попередньо завантажених додатків google використовують цей підхід, і, отже, це гарна ідея! На екрані налаштувань я виявив, що стандартна сіра кнопка виглядає не на місці, і завдяки вам я знайшов хороший спосіб зробити її виглядом стандартизованою :)
Том,

5
Переконайтеся, що android:key="key"і findPreference("key");використовуєте той самий ключ.
Рід

4
насправді це зовсім не відображає кнопку, яка збиватиме з пантелику користувача, а не те, що запитувала ОП. правильна відповідь, щоб насправді показати кнопку - це Ніколя.
mutable2112

7
Я щойно помітив, що я опублікував це в 2011 році о 1:11. Ха-ха.
Рід

3
Треба було це зробити через 1 місяць і 11 днів:
11/1

43

Я гадаю, що це занадто пізно. Це те, що я зробив для налаштування кнопки.

Перевага у файлі preference.xml у папці xml

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

та 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:widgetLayoutє ідеальним зв'язком між фрагментами та налаштуваннями (один або обидва визначені в XML). Дуже дякую. Тут
peter_the_oak

Привіт @Nicolas Ваш код працює, але одне питання ... Як це зробити, щоб кнопка працювала в класі, який розширює функцію PreferenceActivity
SP

4
Скажіть, будь ласка, як знайти цю кнопку з id "resetButton" спасибі!
Бен Джіма

Я знайшов, використовуючи android: макет перевершує android: widgetLayout. Використовуючи widgetLayout, моя кнопка стала тим, що я можу описати лише як layout_alignParentRight = "true", але така поведінка пішла під час використання android: layout замість цього
JoeHz

1
І я не можу зробити це, щоб запустити обробку подій onPreferenceChange або Click
JoeHz

38

Я хотів додати посилання Exit до налаштувань і зміг змінити код Jakar, щоб він працював так:

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

Спочатку "Налаштування" було "EditTextPreference", яке я редагував вручну.

Потім у класі:

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
Чудово працює. Це геніально!
RRTW

8

Додайте

setContentView(R.layout.buttonLayout);

Внизу

addPreferencesFromResource(R.xml.yourPreference);

Розмітка кнопки:

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

Кнопка доступу:

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

Ви можете отримати кнопку вгорі або внизу екрана, поставивши кнопку в RelativeLayout:

  • top_control_bar
  • bottom_control_bar

bottom_control_bar

Це працювало для мене. Я сподіваюся, що я можу допомогти комусь із цим фрагментом коду.


Я використовував це у своєму додатку, він зберігає кнопку вгорі списку, яка виглядає краще і є більш зручною для кнопок OK і Cancel. Дякую.
Грукс

1

Я не думаю, що існує простий спосіб просто додати кнопку до екрана налаштувань. Налаштування обмежуються:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

Під час використання екрана налаштувань ви обмежуєтесь використанням цих опцій, і немає жодної "кнопкової переваги", яку можна було б легко використати для ваших потреб.

Я шукав подібну функціональність із додаванням кнопок на екран налаштувань, але, здається, вам потрібно створити для цього власний екран, керуючи зміною налаштувань у власній реалізації.


У вас була така ж проблема. Якщо ви хочете натиснути кнопку у своїх уподобаннях, вам слід використовувати саморобний попередній екран :(
Janusz

1

Ви можете зробити це так, щоб отримати доступ до кнопки!

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

Не забудьте додати android:idдо LinearLayout, що містить кнопку в layoutButtons.xml , тобто 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!

не забудьте позначити це питання ПРАВИЛЬНО, якщо ви відчуваєте, що я допоміг вам у цьому?
Шах

0

Ви також можете налаштувати макет налаштування, змінивши його Preference.onCreateView(parent). У наведеному нижче прикладі використовується анонімний внутрішній клас для створення переваг червоного кольору.

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

Ви можете використовувати цю техніку, щоб додати кнопку до подання за замовчуванням.


0

Якщо хтось звертається до вказівки користувача натиснути один із елементів налаштувань і ручок, на якому натискає і на якому базується ваше рішення PreferenceFragmentCompat, тоді ви можете зробити це:

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

Котлін:

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

Створіть нестандартний макет для SettingsFragment.javaтобтоlayout_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>

Потім зверніться до файлу макета у вашому 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>

І тоді, у onViewCreated()вашому методі SettingsFragment.java, ви можете скористатися такою кнопкою:

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

Зразок екрана налаштувань за допомогою кнопки


-1

try android: onClick = "myMethod" працює як шарм для простих подій onclick


4
Preferenceне має onClickвласності
ercan

Відповідь має android:onClickна увазі прикріплений перегляд кнопки, а не в самій перевазі.
Стен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.