我已将设置添加到我的动态壁纸中,但更改时未应用这些设置。如果有人能告诉我为什么我的设置在更改时没有被应用,我将不胜感激。这是我的代码:
的settings.xml
<PreferenceCategory android:title="@string/more">
<PreferenceScreen android:title="@string/more">
<intent android:action="android.intent.action.VIEW"
android:data="market://search?q=pub:PSP Demo Center" />
</PreferenceScreen>
<ListPreference
android:persistent="true"
android:enabled="true"
android:entries="@array/settings_light_number_options"
android:title="@string/settings_light_number"
android:key="light_power"
android:summary="@string/settings_light_number_summary"
android:defaultValue="3"
android:entryValues="@array/settings_light_number_optionvalues" />
<ListPreference
android:persistent="true"
android:enabled="false"
android:entries="@array/settings_speed_number_options"
android:title="@string/settings_speed_number"
android:key="speed"
android:summary="@string/settings_speed_number_summary"
android:defaultValue="10"
android:entryValues="@array/settings_speed_number_optionvalues" />
<ListPreference
android:persistent="true"
android:enabled="false"
android:entries="@array/settings_rotate_number_options"
android:title="@string/settings_rotate_number"
android:key="rotate"
android:summary="@string/settings_rotate_number_summary"
android:defaultValue="8000"
android:entryValues="@array/settings_rotate_number_optionvalues" />
</PreferenceCategory>
</PreferenceScreen>
Settings.java
public class GraffitiLWPSettings extends PreferenceActivity
implements SharedPreferences
.OnSharedPreferenceChangeListener {
public static final String SHARED_PREFS_NAME = "wallpaper_settings";
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
getPreferenceManager().
setSharedPreferencesName(GraffitiLWP.SHARED_PREFS_NAME);
addPreferencesFromResource(R.xml.settings);
getPreferenceManager().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this);
}
protected void onResume() {
super.onResume();
}
protected void onDestroy() {
getPreferenceManager().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
public void onSharedPreferenceChanged(SharedPreferences
sharedPreferences, String key) {
}
}
wallpaper.java
public class GraffitiLWP extends Wallpaper {
private GraffitiLWPRenderer mRenderer;
public static final String SHARED_PREFS_NAME = "wallpaper_settings";
public Engine onCreateEngine() {
mRenderer = new GraffitiLWPRenderer(this);
return new WallpaperEngine(
this.getSharedPreferences(SHARED_PREFS_NAME,
Context.MODE_PRIVATE), getBaseContext(), mRenderer);
}
}
renderer.java
public class GraffitiLWPRenderer extends RajawaliRenderer {
private Animation3D mAnim;
private BaseObject3D mCan;
private SettingsUpdater settingsUpdater;
//private SharedPreferences preferences;
public GraffitiLWPRenderer(Context context) {
super(context);
setFrameRate(20);
}
public class SettingsUpdater implements SharedPreferences
.OnSharedPreferenceChangeListener {
private GraffitiLWPRenderer renderer;
public SettingsUpdater(GraffitiLWPRenderer renderer)
{
this.renderer = renderer;
}
public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) {
preferences.getInt("wallpaper_settings", 0);
renderer.setSharedPreferences(preferences);
}
}
public void initScene() {
System.gc();
ALight light = new DirectionalLight();
light.setPower(this.preferences.getLong("light_power", 3));
light.setPosition(0, 0, -10);
mCamera.setPosition(0, -1, -7);
mCamera.setLookAt(0, 2, 0);
mCamera.setFarPlane(1000);
ObjParser parser = new ObjParser(mContext
.getResources(), mTextureManager, R.raw.spraycan_obj);
parser.parse();
mCan = parser.getParsedObject();
mCan.addLight(light);
mCan.setScale(1.2f);
addChild(mCan);
Number3D axis = new Number3D(0,
this.preferences.getLong("speed", 10), 0);
axis.normalize();
mAnim = new RotateAnimation3D(axis, 360);
mAnim.setDuration(this.preferences.getLong("rotate", 8000));
mAnim.setRepeatCount(Animation3D.INFINITE);
mAnim.setInterpolator(new AccelerateDecelerateInterpolator());
mAnim.setTransformable3D(mCan);
setSkybox(R.drawable.posz, R.drawable.posx,
R.drawable.negz, R.drawable.negx, R.drawable.posy,
R.drawable.negy);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
settingsUpdater = new SettingsUpdater(this);
this.preferences.registerOnSharedPreferenceChangeListener(
settingsUpdater);
settingsUpdater.onSharedPreferenceChanged(preferences, null);
super.onSurfaceCreated(gl, config);
mAnim.start();
}
public void onDrawFrame(GL10 glUnused) {
super.onDrawFrame(glUnused);
mSkybox.setRotY(mSkybox.getRotY() + .5f);
}
}
我知道代码很长但我非常感谢有人能给我的任何帮助。谢谢。
答案 0 :(得分:1)
您将PreferenceScreen嵌套在PreferenceCategory中。
- 编辑 - 经过仔细检查,标签全部混淆了。 (您正在关闭PreferenceScreen两次)
我认为基本结构是:
<PreferenceScreen android:title="@string/more">
<PreferenceCategory android:title="@string/more">
<ListPreference android:title="@string/settings_something"/>
</PreferenceCategory>
</PreferenceScreen>
此外,您为每个偏好添加了android:enabled="false"
。
我可以想象这会禁用输入......
答案 1 :(得分:0)
您需要将wallpaper.java更改为:
public class GraffitiLWP extends Wallpaper
implements OnSharedPreferenceChangeListener{
private GraffitiLWPRenderer mRenderer;
public static final String SHARED_PREFS_NAME = "wallpaper_settings";
private SharedPreferences prefs;
public Engine onCreateEngine() {
mRenderer = new GraffitiLWPRenderer(this);
prefs = getSharedPreferences(SHARED_PREFS_NAME, 0);
prefs.registerOnSharedPreferenceChangeListener(this);
return new WallpaperEngine(
this.getSharedPreferences(SHARED_PREFS_NAME,
Context.MODE_PRIVATE), getBaseContext(), mRenderer);
}
}
基本上我刚添加implements OnSharedPreferenceChangeListener
和
prefs = getSharedPreferences(SHARED_PREFS_NAME, 0);
prefs.registerOnSharedPreferenceChangeListener(this);
答案 2 :(得分:0)
我和rajawali引擎有同样的问题;或者至少我虽然有。 我可以从预览中进入偏好,但是当选择并应用动态壁纸时我无法进行。 我做了什么:我以这种方式改变了清单(你宣布了偏好活动):
<activity
android:label="@string/settings"
android:name="com.onebutton.livewallpaper.budastatuefree.BudaStatueFreeSettings"
android:theme="@android:style/Theme.Light.WallpaperSettings"
android:exported="true">
</activity>
当然,您必须更改活动名称
希望这对你有用......
答案 3 :(得分:0)
如果您不需要,请不要过于复杂。您只需要在渲染器中使用这样的函数:
private void setOnPreferenceChange(){
mListener = new OnSharedPreferenceChangeListener(){
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if ("cool_pref".equals(key))
{
camSpeed = Integer.parseInt(sharedPreferences.getString(key, "default"));
}
preferences = sharedPreferences;
}
};
}
在initScene中调用该函数,您就可以开始了。
我也是这样做来获取每个initScene的首选项:
private void setPrefsToLocal(){
localPrefVar= Integer.parseInt(preferences.getString("cool_pref", "default"));
}