假设我有一个应用程序将首选项保存到两个文件,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
我很难找到Android API中提供的MultiSelectListPreference的一个很好的例子.我看过很多对这个博客的引用,这就是我想要的最终结果,我不想为我想要实现的每个多选择首选项创建一个类.最后,我希望看到一个简单的多选对话框(我将动态填充值)的首选项xml,以及调用addPreferencesFromResource(R.xml.preferences);
目前,我有:
<MultiSelectListPreference
android:defaultValue=""
android:enabled="true"
android:entries="@array/pref_default_entries"
android:entryValues="@array/pref_default_values"
android:key="TargetList"
android:persistent="true"
android:summary="@string/TargetSummary"
android:title="@string/TargetTitle" />
Run Code Online (Sandbox Code Playgroud)
当我尝试在我的Activities onCreate调用中调用addPreferencesFromResource时,我收到以下错误:
06-18 13:59:30.690: E/AndroidRuntime(6052): FATAL EXCEPTION: main
06-18 13:59:30.690: E/AndroidRuntime(6052): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tracker/com.tracker.TrackerActivity}: android.view.InflateException: Binary XML file line #37: Error inflating class java.lang.reflect.Constructor
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1818)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1834)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread.access$500(ActivityThread.java:122)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1027)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.os.Handler.dispatchMessage(Handler.java:99)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.os.Looper.loop(Looper.java:132)
06-18 13:59:30.690: E/AndroidRuntime(6052): at android.app.ActivityThread.main(ActivityThread.java:4126)
06-18 13:59:30.690: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的首选项屏幕中显示操作栏.为此,我在SettingActivity中添加了以下代码
public class PreferencesActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preferences_activity);
getFragmentManager().beginTransaction()
.replace(R.id.container, new PreferencesFragment()).commit();
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
Run Code Online (Sandbox Code Playgroud)
然后是我在PreferencesFragment中的其余代码.这样可以正常工作,但只要按下PreferenceScreen首选项,操作栏就会隐藏.如果我回到偏好主屏幕,我可以再次看到它.知道如何显示操作栏(并使用PreferenceScreen标签更新)吗?
编辑:查看PreferenceScreen代码,当单击PreferenceScreen时,它看起来像是一个全屏对话框.因为我的偏好有标题,所以Dialog也应该显示标题......但事实并非如此
Run Code Online (Sandbox Code Playgroud)// Set the title bar if title is available, else no title bar final CharSequence title = getTitle(); Dialog dialog = mDialog = new Dialog(context, context.getThemeResId()); if (TextUtils.isEmpty(title)) { dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); } else { dialog.setTitle(title); }
android preferenceactivity android-actionbar preferencefragment
我已定义dialogfragments(因为Android文档说它更好,确实是这样)但现在我想用它PreferenceActivity.
问题是我不能getSupportFragmentManager()在那里使用,我不能使用PreferenceFragment,因为它不兼容兼容库.看起来像一个路障场景.
任何人都可以就此提出建议吗?
我想添加ToolBar在PreferenceActivity我的Android应用程序.我写了以下代码.
public class SettingsActivity extends PreferenceActivity {
SendSMS sms;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();
android.support.v7.widget.Toolbar bar = (android.support.v7.widget.Toolbar) LayoutInflater.from(this).inflate(R.layout.action_bar_setting, root, false);
root.addView(bar, 0);
bar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
Run Code Online (Sandbox Code Playgroud)
}
这在我的机器人Kitkat手机API 19中完美运行,但强制关闭API级别10即姜饼.请建议我.
我在xml中设置数据绑定但是当我转到首选项活动以实际设置绑定时我不能.数据绑定xml所在的文件名为preference.xml,因此我假设应该有一个名为PreferencesBinding的生成类,而不是.它应该不是自动生成的吗?另外我在preferenceActivity.java中的代码不会编译以下内容:
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PreferencesBinding binding = DataBindingUtil..... //what do put here ??? this is preferenceactivity not Activity
Admin user = new Admin(true);
binding.setUser(user);//this what i want to do
addPreferencesFromResource(R.xml.preferences);//this would not be necessary if i can get dataBinding to work
//..rest of code not important
}
Run Code Online (Sandbox Code Playgroud)
我开始认为数据绑定不适用于偏好屏幕,任何人都可以帮忙吗?
如果neseccary看起来像这样的preferences.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:customNS="http://schemas.android.com/apk/res/mypackage"
>
<data>
<variable name="admin" type="mypackage.Administration"/>
</data>
<PreferenceScreen>
<!-- ....bunch of preferences ... -->
</PreferenceScreen>
</layout
Run Code Online (Sandbox Code Playgroud) 我有一个RingtonePreference,用于选择一个铃声,该铃声被广播到Alarm应用程序中使用的接收器.
我想在RingtonePrefernce的摘要中显示所选铃声的标题(在您选择铃声时看到的列表中显示的标题).不知何故获得ID3标签?有些铃声是mp3而不是全部,所以这可能不是一个好主意?
我现在做的是:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
strRingtonePreference = prefs.getString("RingtonePref", "DEFAULT_RINGTONE_URI");
Run Code Online (Sandbox Code Playgroud)
这将使strRingtonePreference看起来像"content:// media/internal/audio/media/55",这对用户来说不是很有用.
我怎样才能做到这一点?
我正在使用minSdkVersion ="11"开发应用程序,这是适用于平板电脑和Android 4.0及更新版本的应用程序.我已经仔细审查了这个话题,但是没有找到太多.
要为以前版本的Android SDK实现自定义布局,我们只需要使用ListView创建布局(比如preference.xml),其id等于android.R.id.list并使用setContentView方法.
preference.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
在Android 3.0中,事情发生了变化,使用片段实现了Preferences.这就是我的preference_headers.xml文件的样子:
<preference-headers
xmlns:android="http://schemas.android.com/apk/res/android">
<header android:fragment="com.example.MyPreferenceActivity$GeneralSettingsFragment"
android:title="General"
android:summary="Common settings." />
<header
android:title="Example.com" >
<intent android:action="android.intent.action.VIEW"
android:data="http://www.example.com" />
</header>
</preference-headers>
Run Code Online (Sandbox Code Playgroud)
MyPreferenceActivity.java:
public class MyPreferenceActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preference);
// Add a button to the header list.
if (hasHeaders()) {
Button button = new Button(this);
button.setText("Log out");
setListFooter(button);
}
}
/**
* Populate the …Run Code Online (Sandbox Code Playgroud) 我正在构建一个Preference Activity,其中列表中的大多数首选项将执行代码而不直接修改SharedPreference.我的preferences.xml文件看起来像这样.
<PreferenceCategory
android:title="Connection" >
<Preference
android:id="@+id/settings_connectToNewComputer"
android:key="connectToNewComputer"
android:summary="Currently connected to:"
android:title="Connect to new computer" />
<Preference
android:id="@+id/removeDevice"
android:key="removeDevice"
android:summary="Remove this device from the computer's whitelist"
android:title="Remove this device from computer" />
</PreferenceCategory>
<PreferenceCategory
android:title="About" >
<Preference
android:id="@+id/settings_About"
android:key="about"
android:summary="About me and my thanks to those who made this app great"
android:title="About Hue Pro" />
<Preference
android:id="@+id/contact"
android:key="contact"
android:summary="Contact me with comments, bugs, and suggestions for updates"
android:title="Contact me" />
</PreferenceCategory>
Run Code Online (Sandbox Code Playgroud)
我的目标是在单击其中一个首选项时执行一段代码.与Google Play设置首选项菜单中的"清除搜索记录"类似.(http://i.imgur.com/qnHbJX9.png)
有谁知道如何使这成为可能?
我必须补充一点,我尝试使用findPreference("KeyNameHere"),但它总是返回null.
谢谢!
编辑:
我在此代码中添加并实现了OnPreferenceClickListener: …
我有一个SettingsActivity扩展PreferenceActivity到我的应用程序中显示设置.
有一个后退箭头,但它不起作用.
这是SettingsActivity.java文件的代码:
public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener{
private AppCompatDelegate mDelegate;
public static final String RESET_PASSWORD_KEY = "reset_password";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
getDelegate().installViewFactory();
getDelegate().onCreate(savedInstanceState);
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
SharedPreferences sharedPreferencesCompat = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
Preference myPref = (Preference) findPreference(RESET_PASSWORD_KEY);
myPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
//open browser or intent here
Intent resetPasswordActivityIntent = new Intent(SettingsActivity.this, ResetPasswordActivity.class);
startActivity(resetPasswordActivityIntent);
return true;
}
});
}
@Override
protected void onPostCreate(Bundle savedInstanceState) …Run Code Online (Sandbox Code Playgroud) android preferenceactivity android-preferences android-sharedpreferences