我在PreferenceFragment中获取一些自定义DialogPreference子类时遇到了一些麻烦,以便在旋转屏幕时保持可见.我在使用PreferenceActivity时没有遇到这个问题,因此我不知道它是Android错误还是代码问题,但我希望有人确认他们是否有相同的体验.
要对此进行测试,首先要创建一个包含至少一个DialogPreference的首选项屏幕(哪个子类无关紧要).然后在PreferenceActivity中显示它.运行应用程序时,请按DialogPreference以显示其对话框.然后旋转屏幕以使方向发生变化.对话框是否仍然可见?
然后尝试相同,但使用PreferenceFragment显示您的首选项而不是PreferenceActivity.再次,旋转屏幕时对话框是否仍然可见?
到目前为止,我发现如果使用PreferenceActivity,对话框将保持可见,但如果使用PreferenceFragment则不会.查看DialogPreference的源代码,似乎正确的行为是对话框保持可见,因为在屏幕isDialogShowing重定向时onSaveInstanceState()调用时会保存状态信息.因此,我认为一个错误可能会阻止PreferenceFragment(及其中的所有内容)恢复该状态信息.
如果它是Android错误,那么它具有深远的影响,因为任何使用PreferenceFragment的人都无法保存和恢复状态信息.
有人可以确认吗?如果它不是一个错误,那么发生了什么?
android preferenceactivity android-preferences android-fragments dialog-preference
我想在我的应用程序中只运行一段代码,并且是第一次运行它时(新安装的应用程序).我怎么能这样做,任何人都可以解释给出一段代码.
实际上,在我的android项目中,我想创建数据库并在第一次运行时插入一些值.之后,该特定代码不应该再次运行.如何通过SharedPreferences或Preferences实现此机制.
示例代码将更有帮助.
大家好我已经在清单文件中设置了这样的主题:
android:theme="@android:style/Theme.Light"
Run Code Online (Sandbox Code Playgroud)
但我在首选项活动中有一个问题,在主要首选项中主题显示确定,但如果我得到一个子偏好,主题变得混乱,它不是白色应该,它是全黑的,字体是黑色,所以你看不到多少,当我开始点击任何项目时,他们有时会变成白色,但很快就会恢复到黑色.这只发生在2.1,在真实设备和仿真器中.在运行1.6的模拟器上测试,它运行正常.以下是首选项xml文件的代码的一部分:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
android:title="@string/account">
<CheckBoxPreference
android:key="enable_account"
android:title="@string/account_use"
android:summary="@string/account_summ" />
<EditTextPreference
android:key="username"
android:title="@string/login"
android:dependency="enable_account"
android:summary="@string/login_summ" />
<EditTextPreference
android:key="password"
android:title="@string/password"
android:dependency="enable_account"
android:summary="@string/password_summ"
android:password="true" />
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
这是一个截图:
替代文字http://i39.tinypic.com/16hnhh3.png
任何解决方法?
我正在尝试使用AppCompatActivity和support.v7.preference在子屏幕上实现首选项
根据文档,另一个PreferenceScreen中的每个PreferenceScreen都用作子屏幕,框架将处理单击时显示它. http://developer.android.com/guide/topics/ui/settings.html#Subscreens
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- opens a subscreen of settings -->
<PreferenceScreen
android:key="button_voicemail_category_key"
android:title="@string/voicemail"
android:persistent="false">
<ListPreference
android:key="button_voicemail_provider_key"
android:title="@string/voicemail_provider" ... />
<!-- opens another nested subscreen -->
<PreferenceScreen
android:key="button_voicemail_setting_key"
android:title="@string/voicemail_settings"
android:persistent="false">
...
</PreferenceScreen>
<RingtonePreference
android:key="button_voicemail_ringtone_key"
android:title="@string/voicemail_ringtone_title"
android:ringtoneType="notification" ... />
...
</PreferenceScreen>
...
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
这可以使用本机Activity,PreferenceFragment工作正常...但是使用AppCompatActivity和PreferenceFragmentCompat,单击Preference元素只会突出显示它,但不会打开子屏幕.
我在这个文档和代码上找不到任何东西......我需要实现任何额外的回调吗?
编辑:只是为了完整...
这可以工作并打开子屏幕:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new DemoPreferenceFragment())
.commit();
}
}
static public class DemoPreferenceFragment extends PreferenceFragment {
@Override …Run Code Online (Sandbox Code Playgroud) 几天前谷歌推出了Preference Support Library(Link).我刚刚尝试在我的应用程序中实现它,虽然看起来它不能用于SwitchPreferences哪个是奇怪的,因为谷歌表示我们可以使用与以前相同的XML文件,并且明确表示SwitchPreferences现在可用于所有API 7+设备.
报价(来源)
[...]并使用相同的首选XML文件(http://goo.gl/wOcIxI)添加首选项,同时向所有API 7+设备添加对SwitchPreference等元素(以前仅在API 14+设备上可用)的支持.[...]
错误信息
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.package/com.my.package.Main}: android.view.InflateException: Binary XML file line #4: Error inflating class (not found)SwitchPreference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
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:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Run Code Online (Sandbox Code Playgroud)
相关部分显然是Binary XML file line #4: Error inflating class (not found)SwitchPreference.
Java代码
public class FragmentSettings extends PreferenceFragmentCompat {
@Override
public …Run Code Online (Sandbox Code Playgroud) android android-preferences android-support-library android-switch
如何获得XML中定义的Android首选项的默认值?我不想在代码和首选项XML中重复默认值的定义.
Android新手,我在用户更改首选项时有一些代码我将UI首选项中的"摘要"字段更新为他们输入的值.但是,在创建首选项活动时,我想将"摘要"字段设置为相应首选项中的值.请指教.谢谢.
public class MyPreferenceActivity extends PreferenceActivity implements
OnSharedPreferenceChangeListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference);
SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
sp.registerOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
Preference pref = findPreference(key);
if (pref instanceof EditTextPreference) {
EditTextPreference etp = (EditTextPreference) pref;
pref.setSummary(etp.getText());
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想支持至少api 10,我希望能够很好地设置我的偏好,我希望能够有标题(或显示PreferenceScreens).似乎PreferenceActivity不完全支持AppCompat着色,不适合.所以我正在尝试使用AppCompatActivity和PreferenceFragmentCompat.
public class Prefs extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null)
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, new PreferencesFragment())
.commit();
}
public static class PreferencesFragment extends PreferenceFragmentCompat {
@Override public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
// the following call results in a dialogue being shown
super.onDisplayPreferenceDialog(preference);
}
@Override public void onNavigateToScreen(PreferenceScreen preferenceScreen) {
// I can probably …Run Code Online (Sandbox Code Playgroud) android android-appcompat android-preferences android-support-library
我曾经PreferenceActivity在我的Android应用程序中有偏好.我想要一个偏好说"pref 2"在其他偏好说"pref 1"未被选中时被启用,而"pref 2"在被选中"pref 1"时被禁用.即恰好与android:dependancy属性相反.
我怎样才能做到这一点?
假设我有一个应用程序将首选项保存到两个文件,preferences1.xml和preferences2.xml.然后,我可以使用以下代码检索对相应对象的引用:
SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE);
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我可以操纵两者的首选项并注册侦听器以获取两者的更改.
我对这两个文件的初始化有一些疑问,使用setDefaultValues:
问题1 - PreferenceFragment上下文:我已经创建了一个PreferenceActivity具有两个PreferenceFragments和内的onCreate每一个I执行下面的代码的方法(与图1和2为取代片段1 X和2):
PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesName("preferencesX");
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false);
Run Code Online (Sandbox Code Playgroud)
我已经看到两个片段在启动时都正确地设置了它们的默认值.但是,鉴于我在应用程序的shared_prefs目录中只能看到一个_has_set_default_values.xml文件,它是如何理解属性的preferences1.xml和preferences2.xml已经设置好了吗?只要在第一个打开的PreferenceFragment中调用setDefaultValues就会创建此文件,但即使在此之后,如果我打开第二个PreferenceFragment,它也会正确初始化默认值.如何理解它尚未初始化preferences2.xml以及_has_set_default_values.xml的目的是什么,因为它不包含有关哪些优先文件已被初始化的信息?
问题2 - 标准活动上下文:当我启动我的应用程序时,PreferenceActivity不是第一个启动的活动,用户可能永远不会打开它,所以我想在主Activity中初始化两个首选项文件及其默认值,我怎样才能做到这一点?对于默认的共享首选项,很容易:
PreferenceManager.setDefaultValues(this, R.xml.default_preferences, false);
Run Code Online (Sandbox Code Playgroud)
对于两个首选项文件,我该怎么办?我无法执行以下操作,因为我无法在PreferenceFragment类中检索PreferenceManager的实例:
PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND …Run Code Online (Sandbox Code Playgroud) android preferenceactivity android-preferences sharedpreferences android-activity