如何在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>

Button应该在两个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()但这返回null。有什么想法可以访问这些按钮吗?



2
顺便说一句,@ neelabh的答案是最简单的-您可以通过在xml-layout中指定事件处理程序来实现所需的行为:只需将其添加android:onClick="method"到每个按钮中,其中方法在活动中定义为public void method(View v)
Stan

Answers:


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/myCoolButtongetString(R.string.myCoolButton)因为最好使用资源来提供编译器帮助,语言翻译和String更改的简便性。


7
许多预加载的google应用都使用这种方法,因此遵循它是一个好主意!我发现偏好设置屏幕上的标准灰色按钮看起来不合适,并且感谢您,我找到了一种使它看起来标准化的好方法:)
汤姆

5
确保android:key="key"findPreference("key");使用相同的密钥。
里德2012年

4
实际上,这根本不显示按钮,这会使用户感到困惑,而不是OP要求的。实际显示一个按钮的正确答案是尼古拉斯。
mutable2112

7
我只是注意到我在2011年1月11日发布了此信息。哈哈。
Reed

3
应该在1个月和11天后完成:11/1 / '11-1:11 :)
P Kuijpers

43

我支持为时已晚。这是我为按钮首选项所做的。

xml文件夹中preference.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:widgetLayout的android:layout。使用widgetLayout,我的按钮变成了我只能描述为layout_alignParentRight =“ true”的按钮,但是当使用android:layout时,该行为就消失了
JoeHz 2016年

1
我无法触发onPreferenceChange或Click事件处理程序
JoeHz

38

我想将退出链接添加到首选项,并能够修改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);

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

这对我有用。我希望我可以帮助某人使用这段代码。


我在我的应用程序中使用了它,它使按钮保持在列表顶部,这看起来更好,并且对于“确定”和“取消”按钮更加用户友好。谢谢。
Grux

1

我认为没有简单的方法可以将按钮添加到首选项屏幕。首选项限于:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

使用首选项屏幕时,您只能使用这些选项,并且没有单个“按钮首选项”可以轻松满足您的需要。

我一直在寻找类似的功能,即在首选项屏幕中添加按钮,但是似乎您需要为此构建自己的屏幕,并在自己的实现中管理对首选项的更改。


遇到同样的问题,如果您想在偏好设置中使用按钮,则必须使用自制的偏好屏幕:(
Janusz

1

您可以像这样操作来访问按钮!

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

不要忘了添加android:id到包含layoutButtons.xml中的按钮的LinearLayout中,即 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!

如果您觉得我在其中帮助过您,别忘了将此问题标记为TRUE吗?
沙阿(Shah)

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.javaie 创建自定义布局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

尝试android:onClick =“ myMethod”就像简单onclick事件的超级按钮一样工作


4
Preference没有onClick财产
ercan 2014年

答案隐含android:onClick在附加的按钮视图中,而不隐含在首选项本身中。
Stan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.