答案在底部。
我在4.0.4浏览器中添加了一个修改,添加了一个新的首选项部分。启动浏览器时,会正确读取值并且似乎已缓存。我在Controller.java使用getMaxTabs时添加了一个日志事件,它只在第一次启动时读取。如果我改变设置没有任何反应。但是如果我在更改设置后终止浏览器并重新启动,则会正确读取新值。有没有办法强制在更改时重新缓存此设置?
我正在查看SharedPreferences.OnSharedPreferenceChangeListener,但我没有看到如何强行重读该变量。
int getMaxTabs() {
Context mContext = mActivity.getApplicationContext();
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
String numTabs = mPrefs.getString(PreferenceKeys.PREF_MAX_TABS, "20");
int t = Integer.parseInt(numTabs);
Log.i("max open tabs", "max: " + t);
return t;
// The original content of getMaxTabs is below
// return mActivity.getResources().getInteger(R.integer.max_tabs);
}
因此,日志项仅在首次启动浏览器时出现。设置了新的首选项,因为如果我更改它并终止/重新启动浏览器,则会反映新值。我需要不缓存此设置或强制缓存在更改时刷新,这样会更有效。
的src / COM /机器人/浏览器/偏好/ TabsPreferencesFragment.java
package com.android.browser.preferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import com.android.browser.BrowserSettings;
import com.android.browser.PreferenceKeys;
import com.android.browser.R;
import com.android.browser.search.SearchEngine;
public class TabsPreferencesFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the XML preferences file
addPreferencesFromResource(R.xml.tabs_preferences);
}
}
RES / XML / tabs_preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" >
<ListPreference
android:key="max_open_tabs"
android:defaultValue="20"
android:title="@string/pref_max_open_tabs"
android:entries="@array/pref_max_open_tabs_choices"
android:entryValues="@array/pref_max_open_tabs_values"
/>
</PreferenceScreen>
这是在src / com / android / browser / TabControl.java
中调用它的方式private int mMaxTabs;
TabControl(Controller controller) {
mController = controller;
mMaxTabs = mController.getMaxTabs();
mTabs = new ArrayList<Tab>(mMaxTabs);
mTabQueue = new ArrayList<Tab>(mMaxTabs);
}
boolean canCreateNewTab() {
return mMaxTabs > mTabs.size();
}
解
答案就在这里,在packages / apps / Browser / src / com / android / browser / TabControl.java中
第55行,我们看到:
/**
* Construct a new TabControl object
*/
TabControl(Controller controller) {
mController = controller;
mMaxTabs = mController.getMaxTabs();
mTabs = new ArrayList<Tab>(mMaxTabs);
mTabQueue = new ArrayList<Tab>(mMaxTabs);
}
TabControl对象在浏览器启动时构造一次。这里我们通过调用mController.getMaxTabs()来定义mMaxTabs。
第155行围绕canCreateNewTab定义,使用mMaxTabs。
boolean canCreateNewTab() {
return mMaxTabs > mTabs.size();
}
由于mMaxTabs是静态值,因此在首选项更新时永远不会改变。
解决方案就是这样。
/**
* Construct a new TabControl object
*/
TabControl(Controller controller) {
mController = controller;
mTabs = new ArrayList<Tab>(mMaxTabs);
mTabQueue = new ArrayList<Tab>(mMaxTabs);
}
boolean canCreateNewTab() {
return mController.getMaxTabs() > mTabs.size();
}
现在,每次请求新的浏览器选项卡时,都会验证pref设置。