如何添加按钮到首选项屏幕?

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

按钮应该就在两个 ABC 的正下方。

这个问题有简单的解决办法吗?我发现的一个解决方案不起作用,因为我使用子 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()试过了,但是返回的是 null。有什么办法可以访问这些按钮吗?

88107 次浏览

我不认为有一个简单的方法,只是添加一个按钮到首选项屏幕。优惠仅限于:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

在使用首选项屏幕时,您仅限于使用这些选项,并且没有单个的“按钮首选项”可以轻松地用于您的需要。

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

你可以这样来访问按钮!

 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!

对于 xml:

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

然后对于你的 onCreate()中的 java

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

这将看起来像一个正常的首选项,只有一个标题和一个摘要,所以它将看起来像属于。

试试 android: onClick = “ myMethod”对于简单的 onClick 事件非常有用

我想在首选项中添加一个 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>

最初的“偏好”是一个“编辑文本偏好”,我手工编辑。

然后在课堂上:

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

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
  • 底部 _ 控制 _ 条

底部 _ 控制 _ 条

这对我很有用,我希望我能帮助别人破解这段代码。

我想已经太迟了。 这是我所做的按钮偏好。

Xml 文件夹中的 ferences ence.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 _ set _ 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>

您还可以通过覆盖 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;
}
});

您可以使用此技术向默认视图添加按钮。

如果你想抓住一个用户点击其中一个首选项,并且你的应用程序正在使用 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
}

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>

然后,在 SettingsFragment.javaonViewCreated()方法中, 可以像这样使用按钮:

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

Sample Settings Screen with Button