我已经为我的应用程序创建了一个设置菜单PreferenceFragment,并希望从应用程序的其他位置访问设置对话框,而无需打开设置菜单.
我的设置菜单包含:

当我从主要活动中单击此菜单项时,我想显示相同的对话框:

main Activity有一个ListFragment是所有UI处理代码的地方.也不是一个PreferenceActivity或PreferenceFragment.
我只是想调用相同的PreferenceFragment对象来进入对话框,否则我必须编写自定义代码来手动处理首选项更改,我想避免.
我想加入PreferenceFragment到FragmentManager主Activity会适当地初始化它,但它似乎并没有工作.
从我的菜单处理程序代码"排序"选项:
SettingsFragment fragment = (SettingsFragment) getFragmentManager().findFragmentByTag(SettingsActivity.FRAGMENT_TAG);
// first run case
if (fragment == null) {
fragment = SettingsFragment.newInstance(getActivity());
getFragmentManager().beginTransaction().add(fragment, SettingsActivity.FRAGMENT_TAG).commit();
}
CustomListPreference listPref = (CustomListPreference) fragment.findPreference(SettingsFragment.KEY_PREF_SORTORDER);
listPref.show(); // invokes showDialog(null)
Run Code Online (Sandbox Code Playgroud)
这与一个NullPointerException打开崩溃listPref,显示PreferenceFragment未正确初始化.
有没有办法实现这种效果,还是我必须将功能写为AlertDialog并手动处理首选项更改?
谷歌已经不支持向后兼容性首选项看起来像全息/材料在过去,这就是为什么我做了我自己的图书馆这个(在这里,万一有人需要它),但现在我认为,谷歌提供了一些那种对它的支持,在这里.
目前,我看不到任何教程或样本.我想知道这个新API的功能,但我不能.
我按照网站上的说明做了,并且它甚至适用于Android GB,但这是我得到的:
如您所见,类别标题是GB样式而不是材料设计,您看不到的是点击项目将具有与GB相同的效果.在首选项中创建的对话框的某些元素也是如此.几乎所有东西都是本土风格.在3.x-4.x版本的Android上也会出现同样的情况.
这是代码:
styles.xml
<style name="AppTheme" parent="Theme.AppCompat">
<!-- Customize your theme here. -->.
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
<item name="colorPrimary">#FF0288D1</item>
</style>
Run Code Online (Sandbox Code Playgroud)
主要活动
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar _toolbar = (Toolbar) findViewById(R.id.activity_app_list__toolbar);
//
setSupportActionBar(_toolbar);
getSupportFragmentManager().beginTransaction().replace(R.id.container,
new SettingsFragment()).commit();
}
}
Run Code Online (Sandbox Code Playgroud)
SettingsFragment.java
public class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.preferences);
}
}
Run Code Online (Sandbox Code Playgroud)
的preferences.xml
<?xml version="1.0" …Run Code Online (Sandbox Code Playgroud) android preferenceactivity android-support-library preferencefragment material-design
我已经用ViewPager制作了一个应用程序。当我进行调试构建并在手机上对其进行测试时,一切工作正常。(不是模拟器)但是,当我构建发行版.apk并安装它时,PreferenceFragmentCompat的addPreferencesFromResource(R.xml.preferences); 使应用程序崩溃。 PreferenceFragmentCompat-Android开发人员
ApplicationSettingsFragment.java:
package hu.t_bond.homecontroller.Fragments;
import android.os.Bundle;
import android.support.v7.preference.PreferenceFragmentCompat;
import hu.t_bond.homecontroller.Launcher;
import hu.t_bond.homecontroller.R;
public class ApplicationSettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getPreferenceManager().setSharedPreferencesName(Launcher.SETTINGS_NAME);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onCreatePreferences(Bundle bundle, String s)
{
}
}
Run Code Online (Sandbox Code Playgroud)
res / xml / preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="AutoUpdatesEnabled"
android:title="@string/auto_updates_enabled"
android:summary="@string/auto_updates_enabled_description"
android:defaultValue="true" />
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
和崩溃报告:
10-26 14:20:07.661 17763-17890/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: hu.t_bond.homecontroller, PID: 17763
android.view.InflateException: Binary XML file line #2: Error inflating class PreferenceScreen …Run Code Online (Sandbox Code Playgroud) android android-support-library preferencefragment preference-v7
我PreferenceFragment在Android中加载时遇到问题。在这一点上,这是一个非常基本的实现,我想稍后在其工作时进行扩展。
问题在于,导航到后,仅显示第一个首选项SettingsFragment。
我没有收到任何错误,但是logcat向我显示了这个:
W/PathParser: Points are too far apart 4.000000596046461
我用谷歌搜索,但是没有任何有用的解决方案。
代码如下:
MainActivity通过NavigationDrawer导航
navigate() 是使用 FragmentManager
case R.id.nav_settings:
navigate(new SettingsFragment(), "settingsFragment", false);
break;
Run Code Online (Sandbox Code Playgroud)
设置片段
public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
public SettingsFragment() { }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { }
}
Run Code Online (Sandbox Code Playgroud)
prefences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen …Run Code Online (Sandbox Code Playgroud) android android-preferences sharedpreferences preferencescreen preferencefragment
我正在尝试创建一个扩展 AppCompatActivity 并在其中包含两个片段的 Activity(一个片段位于另一个片段下方 - 仅通过使用 LinearLayout)。我希望第一个片段从 support-v7 库中扩展 PreferenceFragmentCompat 类。
我遵循了谷歌关于 PreferenceFragmentCompat 的简短示例,如https://developer.android.com/reference/android/support/v7/preference/PreferenceFragmentCompat.html所示。
这是我当前的代码:
GroupDetailsActivity.java
public class GroupDetailsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_group_details);
GroupDetailsPrefFragment prefFragment = GroupDetailsPrefFragment.newInstance();
GroupDetailsMembersFragment membersFragment = GroupDetailsMembersFragment.newInstance();
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.add(R.id.flPrefFragment, prefFragment, GroupDetailsPrefFragment.TAG)
.add(R.id.flMembersFragment, membersFragment, GroupDetailsMembersFragment.TAG)
.commit();
}
}
Run Code Online (Sandbox Code Playgroud)
GroupDetailsPrefFragment .java - 有问题的片段
public class GroupDetailsPrefFragment extends PreferenceFragmentCompat {
public static final String TAG = "GroupDetailsPrefFragment";
@Override
public void onCreatePreferences(Bundle bundle, String s) {
setPreferencesFromResource(R.xml.group_details_preferences, …Run Code Online (Sandbox Code Playgroud) android android-fragments preferencefragment appcompatactivity support-preference
在我的Android应用程序中,我定义了一个非常基本的PreferenceScreen:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:entries="@array/test_entries"
android:entryValues="@array/test_values"
android:key="key_test1"
android:title="Test title 1" />
<CheckBoxPreference
android:key="key_test2"
android:summary="Test description 1"
android:title="Test title 2" />
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
并实现了相应的PreferenceFragmentCompat类:
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings, rootKey)
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用的依赖:
implementation "com.android.support:preference-v7:28.0.0"
Run Code Online (Sandbox Code Playgroud)
以及承载以下内容的布局代码Fragment:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".ui.activity.MainActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/mainToolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize" />
<fragment
android:id="@+id/navHostFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/navigation" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
一切都很好,除了每个偏好左侧有一个巨大的空白区域:
这个问题的原因是什么,我该如何预防呢?
编辑:
似乎问题是图标的空间被保留,即使我们没有使用偏好条目的图标. …
我已经迁移到 androidx.* 库,其中之一是新的首选项库:
androidx.preference:preference:1.1.0-alpha01- 它的最新版本。
如发行说明中 所述,iconSpaceReserved属性与 PreferenceCategories 无法正常工作已修复。
但看起来它默认设置为true。
我已经构建了演示项目来测试它。
首选项片段
import androidx.preference.PreferenceFragmentCompat;
public class SetttingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.preferences);
}
}
Run Code Online (Sandbox Code Playgroud)
首选项.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory android:title="Category 1">
<Preference
android:key="pref1"
android:title="Preference 1" />
<Preference
android:key="pref2"
android:title="Preference 2" />
</PreferenceCategory>
<PreferenceCategory
android:title="Category 2"
app:iconSpaceReserved="false">
<Preference
android:key="pref3"
android:title="Preference 3" />
<Preference
android:key="pref4"
android:title="Preference 4"
app:iconSpaceReserved="false" />
</PreferenceCategory>
...
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
首选项主题根据需要设置。
样式文件
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
Run Code Online (Sandbox Code Playgroud)
截屏
当app:iconSpaceReserved=false …
场景: 我的Android应用程序充当服务器.有N个客户端连接到服务器.用户可以从服务器(Android应用程序)配置客户端的一组设置.所以基本上我通过套接字将用户首选项发送给相应的客户端.所有客户端的设置集都相同,但我需要维护每个客户端的设置状态.例如:
设置集:
Settings 1
Settings 2
Settings 3
Run Code Online (Sandbox Code Playgroud)
现在,用户为2个客户端配置上述设置,如下所示:对于client1:
Settings 1 :true
Settings 2 :false
Settings 3 :false
Run Code Online (Sandbox Code Playgroud)
对于Client2:
Settings 1 :false
Settings 2 :false
Settings 3 :false
Run Code Online (Sandbox Code Playgroud)
现在在Android应用程序中,当用户选择client1时,应显示client1特定集.
问题: 我无法保存客户端明智的设置状态.
我的专长: 我是android编程的初学者.
到目前为止我的进展: 根据我对场景的理解,我需要使客户端明智的不同-2共享首选项文件.我为这组设置创建了一个通用首选项片段.由于所有客户端的设置都相同,因此我重复使用首选项片段.我还尝试为每个客户端动态指定首选项文件:
SharedPreferences sharedPreference = context.getSharedPreferences(
"<Here I dynamically specify prefs file name>", Context.MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
请帮忙.
android preferences preferenceactivity sharedpreferences preferencefragment
我正在尝试使用android.support.v14.preference库中的PreferenceFragment在Android应用中显示设置.但是,当我尝试打开首选项时,应用程序崩溃并出现奇怪的NullPointerException.如果addPreferenceFromResource(R.xml.preferences)我在PreferenceFragment中省略调用,则不会发生这种情况,但当然首选项永远不会显示.
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hardboard.preferencetest/com.hardboard.preferencetest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)
at android.app.ActivityThread.access$800(ActivityThread.java:156)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5373)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
at android.support.v14.preference.PreferenceFragment.bindPreferences(PreferenceFragment.java:473)
at android.support.v14.preference.PreferenceFragment.onActivityCreated(PreferenceFragment.java:278)
at android.app.Fragment.performActivityCreated(Fragment.java:2061)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:912)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.app.BackStackRecord.run(BackStackRecord.java:834)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
at android.app.Activity.performStart(Activity.java:6005)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2342) …Run Code Online (Sandbox Code Playgroud) java android android-support-library preferencefragment android-recyclerview
我正在编写一个 android 应用程序并想要创建一个 SettingsActivity。我的问题是我的矢量可绘制对象无法将其颜色调整为夜间或白天主题。
ic_palette_black_24dp.xml:
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/icon_color_on_surface" android:pathData="M12,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9c0.83,0 1.5,-0.67 1.5,-1.5 0,-0.39 -0.15,-0.74 -0.39,-1.01 -0.23,-0.26 -0.38,-0.61 -0.38,-0.99 0,-0.83 0.67,-1.5 1.5,-1.5L16,16c2.76,0 5,-2.24 5,-5 0,-4.42 -4.03,-8 -9,-8zM6.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,9 6.5,9 8,9.67 8,10.5 7.33,12 6.5,12zM9.5,8C8.67,8 8,7.33 8,6.5S8.67,5 9.5,5s1.5,0.67 1.5,1.5S10.33,8 9.5,8zM14.5,8c-0.83,0 -1.5,-0.67 -1.5,-1.5S13.67,5 14.5,5s1.5,0.67 1.5,1.5S15.33,8 14.5,8zM17.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S16.67,9 17.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z"/>
</vector>
Run Code Online (Sandbox Code Playgroud)
值/colors.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="icon_color_on_surface">#000000</color>
</resources>
Run Code Online (Sandbox Code Playgroud)
值夜/colors.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="icon_color_on_surface">#FFFFFF</color>
</resources>
Run Code Online (Sandbox Code Playgroud)
在我的 root_preferences.xml 中:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" …Run Code Online (Sandbox Code Playgroud) android android-preferences preferencefragment android-dark-theme