Как добавить кнопку на экран предпочтения?

Я совсем новичок в разработке 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>

Кнопка должна находиться прямо под двумя EditTextPreference.

Есть ли простое решение этой проблемы? Единственное решение, которое я нашел, не работало, потому что я использую подпрограммы PreferenceScreen.

Обновление:

Я понял, что могу добавить кнопки таким образом:

<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(), но это возвращает ноль. Любые идеи, как я мог получить доступ к этим кнопкам?

Ответ 1

Для 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), потому что лучше использовать ресурсы для помощи компилятора, перевода языка и простоты изменений в String.

Ответ 2

Я хотел добавить ссылку 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

Я слишком поздно опоздаю. Это то, что я сделал для предпочтения кнопок.

Предпочтение в файле 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>

Ответ 4

Добавить

setContentView(R.layout.buttonLayout);

Ниже

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>

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

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

Это сработало для меня. Надеюсь, я смогу помочь кому-то с этой частью кода.

Ответ 5

Я не думаю, что есть простой способ просто добавить кнопку на экран предпочтений. Предпочтения ограничены:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

При использовании экрана предпочтений вы ограничены использованием этих параметров, и нет никаких "кнопок-предпочтений", которые могут быть легко использованы для ваших нужд.

Я искал аналогичную функциональность, добавляя кнопки на экран предпочтений, но похоже, что вам нужно создать собственный экран для этого, управляя изменением предпочтений в своей собственной реализации.

Ответ 6

Вы можете сделать это так, чтобы получить доступ к кнопке!

 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!

Ответ 7

Вы также можете настроить макет Предпочтения, переопределив 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;
            }
        });

Вы можете использовать эту технику, чтобы добавить кнопку к представлению по умолчанию.

Ответ 8

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

Применить действие к кнопке.

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

Ответ 9

попробуйте андроид: onClick = "myMethod" работает как шарм для простых событий onclick