Java 自定义ColorDialogPreference-保存/检索为SharedReference

Java 自定义ColorDialogPreference-保存/检索为SharedReference,java,android,xml,preferences,live-wallpaper,Java,Android,Xml,Preferences,Live Wallpaper,我很难将其应用到我的实时壁纸中。它本身就可以很好地工作(我可以将它添加到我的首选项菜单,打开小部件并选择一种颜色),但是我想使用所选的颜色来详细说明用户将在主屏幕画布上看到的EditText字段。我可以通过将ColorDialogPreference.java的int color更改为静态变量并直接从WallperService类调用它来轻松实现这一点: int mColor=com.my.app.ColorDialogPreference.color 但由于它是静态的,一旦进程被破坏,颜色就会

我很难将其应用到我的实时壁纸中。它本身就可以很好地工作(我可以将它添加到我的首选项菜单,打开小部件并选择一种颜色),但是我想使用所选的颜色来详细说明用户将在主屏幕画布上看到的EditText字段。我可以通过将
ColorDialogPreference.java的
int color
更改为静态变量并直接从WallperService类调用它来轻松实现这一点:

int mColor=com.my.app.ColorDialogPreference.color

但由于它是静态的,一旦进程被破坏,颜色就会被重置

我试图通过PreferencesActivity.java(见下文)中的SharedReferences编辑器保存变量,但似乎无法在WallperService类中检索该变量

PreferencesActivity.java:

package com.my.app;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class MyPreferencesActivity extends PreferenceActivity
implements SharedPreferences.OnSharedPreferenceChangeListener {

@SuppressWarnings("deprecation")
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

SharedPreferences preferences = 
getSharedPreferences("prefs", MODE_WORLD_WRITEABLE);
getPreferenceManager().setSharedPreferencesName("preferenceKeyName");


SharedPreferences.Editor editor = preferences.edit();


editor.putInt("preferenceKeyName", Color.GRAY);
editor.commit();

getPreferenceManager().setSharedPreferencesName("text_to_display");
getPreferenceManager().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this);
addPreferencesFromResource(R.xml.prefs);
}

@SuppressWarnings("deprecation")
protected void onDestroy() {
getPreferenceManager().getSharedPreferences().
unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
@SuppressWarnings("deprecation")
protected void onResume() {
super.onResume();
getPreferenceManager().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
getPreferenceManager().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this); 
}
}
package com.my.app;

import java.util.List;
import java.util.Random;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;

public class MyWallpaperService extends WallpaperService {

public MyWallpaperService() {
super(); 
}



@Override
public Engine onCreateEngine() {
return new MyWallpaperEngine();
}

public class MyWallpaperEngine extends Engine 
implements OnSharedPreferenceChangeListener {

Context ctx = getApplicationContext();
SharedPreferences sharedPreferences2 =
getSharedPreferences("prefs", MODE_WORLD_READABLE);

private int mColor = sharedPreferences2.getInt("preferenceKeyName",
Color.RED);

private boolean mVisible = false;

Paint p = new Paint();

float x1 = 0;
float y1 = 60;

private final Handler mHandler = new Handler();

private final Runnable mUpdateDisplay = new Runnable() {
@Override
public void run() {
draw();
}};



private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
c = holder.lockCanvas();
if (c != null) {


String text = "1. " + mText;
c.drawRect(0, 0, c.getWidth(), c.getHeight(), p);
p.setColor(mColor);

c.drawText(text, x, y, p);
}
}               
}
} finally {
if (c != null)
holder.unlockCanvasAndPost(c);
}
mHandler.removeCallbacks(mUpdateDisplay);
if (mVisible) {
mHandler.postDelayed(mUpdateDisplay, 16);
}
}

private final Handler handler = new Handler();

private final Runnable drawRunner = new Runnable() {
@Override
public void run() {
draw();
}

};


@Override
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
mVisible = visible;
if (visible) {


mText = sharedPreferences.getString("text_to_display",
"default");

draw();
} else {
mHandler.removeCallbacks(mUpdateDisplay);
}
}

@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
mVisible = false;
handler.removeCallbacks(drawRunner);
mHandler.removeCallbacks(mUpdateDisplay);
}

@Override
public void onDestroy() {
super.onDestroy();
mVisible = false;
mHandler.removeCallbacks(mUpdateDisplay);
}

@Override
public void onSurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
draw();
}

}

@Override
public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) {
// TODO Auto-generated method stub
}
}
}
`<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceScreen android:title="Set Text" android:summary="Some summary" >

<EditTextPreference android:key="text_to_display" android:title="Some text" />
</PreferenceScreen>

<PreferenceScreen android:title="Colors" android:summary="Any color you want!" >

<com.my.app.ColorPickerPreference
android:defaultValue="0xffffffff"
android:key="preferenceKeyName"
android:title="@string/pref_name"
android:summary="@string/pref_summary" />
</PreferenceScreen> 
</PreferenceScreen>`
wallperservice.java:

package com.my.app;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class MyPreferencesActivity extends PreferenceActivity
implements SharedPreferences.OnSharedPreferenceChangeListener {

@SuppressWarnings("deprecation")
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

SharedPreferences preferences = 
getSharedPreferences("prefs", MODE_WORLD_WRITEABLE);
getPreferenceManager().setSharedPreferencesName("preferenceKeyName");


SharedPreferences.Editor editor = preferences.edit();


editor.putInt("preferenceKeyName", Color.GRAY);
editor.commit();

getPreferenceManager().setSharedPreferencesName("text_to_display");
getPreferenceManager().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this);
addPreferencesFromResource(R.xml.prefs);
}

@SuppressWarnings("deprecation")
protected void onDestroy() {
getPreferenceManager().getSharedPreferences().
unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
@SuppressWarnings("deprecation")
protected void onResume() {
super.onResume();
getPreferenceManager().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
getPreferenceManager().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this); 
}
}
package com.my.app;

import java.util.List;
import java.util.Random;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;

public class MyWallpaperService extends WallpaperService {

public MyWallpaperService() {
super(); 
}



@Override
public Engine onCreateEngine() {
return new MyWallpaperEngine();
}

public class MyWallpaperEngine extends Engine 
implements OnSharedPreferenceChangeListener {

Context ctx = getApplicationContext();
SharedPreferences sharedPreferences2 =
getSharedPreferences("prefs", MODE_WORLD_READABLE);

private int mColor = sharedPreferences2.getInt("preferenceKeyName",
Color.RED);

private boolean mVisible = false;

Paint p = new Paint();

float x1 = 0;
float y1 = 60;

private final Handler mHandler = new Handler();

private final Runnable mUpdateDisplay = new Runnable() {
@Override
public void run() {
draw();
}};



private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
c = holder.lockCanvas();
if (c != null) {


String text = "1. " + mText;
c.drawRect(0, 0, c.getWidth(), c.getHeight(), p);
p.setColor(mColor);

c.drawText(text, x, y, p);
}
}               
}
} finally {
if (c != null)
holder.unlockCanvasAndPost(c);
}
mHandler.removeCallbacks(mUpdateDisplay);
if (mVisible) {
mHandler.postDelayed(mUpdateDisplay, 16);
}
}

private final Handler handler = new Handler();

private final Runnable drawRunner = new Runnable() {
@Override
public void run() {
draw();
}

};


@Override
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
mVisible = visible;
if (visible) {


mText = sharedPreferences.getString("text_to_display",
"default");

draw();
} else {
mHandler.removeCallbacks(mUpdateDisplay);
}
}

@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
mVisible = false;
handler.removeCallbacks(drawRunner);
mHandler.removeCallbacks(mUpdateDisplay);
}

@Override
public void onDestroy() {
super.onDestroy();
mVisible = false;
mHandler.removeCallbacks(mUpdateDisplay);
}

@Override
public void onSurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
draw();
}

}

@Override
public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) {
// TODO Auto-generated method stub
}
}
}
`<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceScreen android:title="Set Text" android:summary="Some summary" >

<EditTextPreference android:key="text_to_display" android:title="Some text" />
</PreferenceScreen>

<PreferenceScreen android:title="Colors" android:summary="Any color you want!" >

<com.my.app.ColorPickerPreference
android:defaultValue="0xffffffff"
android:key="preferenceKeyName"
android:title="@string/pref_name"
android:summary="@string/pref_summary" />
</PreferenceScreen> 
</PreferenceScreen>`
我的prefs.xml:

package com.my.app;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class MyPreferencesActivity extends PreferenceActivity
implements SharedPreferences.OnSharedPreferenceChangeListener {

@SuppressWarnings("deprecation")
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

SharedPreferences preferences = 
getSharedPreferences("prefs", MODE_WORLD_WRITEABLE);
getPreferenceManager().setSharedPreferencesName("preferenceKeyName");


SharedPreferences.Editor editor = preferences.edit();


editor.putInt("preferenceKeyName", Color.GRAY);
editor.commit();

getPreferenceManager().setSharedPreferencesName("text_to_display");
getPreferenceManager().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this);
addPreferencesFromResource(R.xml.prefs);
}

@SuppressWarnings("deprecation")
protected void onDestroy() {
getPreferenceManager().getSharedPreferences().
unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
@SuppressWarnings("deprecation")
protected void onResume() {
super.onResume();
getPreferenceManager().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
getPreferenceManager().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this); 
}
}
package com.my.app;

import java.util.List;
import java.util.Random;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;

public class MyWallpaperService extends WallpaperService {

public MyWallpaperService() {
super(); 
}



@Override
public Engine onCreateEngine() {
return new MyWallpaperEngine();
}

public class MyWallpaperEngine extends Engine 
implements OnSharedPreferenceChangeListener {

Context ctx = getApplicationContext();
SharedPreferences sharedPreferences2 =
getSharedPreferences("prefs", MODE_WORLD_READABLE);

private int mColor = sharedPreferences2.getInt("preferenceKeyName",
Color.RED);

private boolean mVisible = false;

Paint p = new Paint();

float x1 = 0;
float y1 = 60;

private final Handler mHandler = new Handler();

private final Runnable mUpdateDisplay = new Runnable() {
@Override
public void run() {
draw();
}};



private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
c = holder.lockCanvas();
if (c != null) {


String text = "1. " + mText;
c.drawRect(0, 0, c.getWidth(), c.getHeight(), p);
p.setColor(mColor);

c.drawText(text, x, y, p);
}
}               
}
} finally {
if (c != null)
holder.unlockCanvasAndPost(c);
}
mHandler.removeCallbacks(mUpdateDisplay);
if (mVisible) {
mHandler.postDelayed(mUpdateDisplay, 16);
}
}

private final Handler handler = new Handler();

private final Runnable drawRunner = new Runnable() {
@Override
public void run() {
draw();
}

};


@Override
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
mVisible = visible;
if (visible) {


mText = sharedPreferences.getString("text_to_display",
"default");

draw();
} else {
mHandler.removeCallbacks(mUpdateDisplay);
}
}

@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
mVisible = false;
handler.removeCallbacks(drawRunner);
mHandler.removeCallbacks(mUpdateDisplay);
}

@Override
public void onDestroy() {
super.onDestroy();
mVisible = false;
mHandler.removeCallbacks(mUpdateDisplay);
}

@Override
public void onSurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
draw();
}

}

@Override
public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) {
// TODO Auto-generated method stub
}
}
}
`<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceScreen android:title="Set Text" android:summary="Some summary" >

<EditTextPreference android:key="text_to_display" android:title="Some text" />
</PreferenceScreen>

<PreferenceScreen android:title="Colors" android:summary="Any color you want!" >

<com.my.app.ColorPickerPreference
android:defaultValue="0xffffffff"
android:key="preferenceKeyName"
android:title="@string/pref_name"
android:summary="@string/pref_summary" />
</PreferenceScreen> 
</PreferenceScreen>`
`
`

如果我在画布上显示
int color
的值,所有出现的都是“-65535”。我知道
首选项活动
在某种程度上是有效的,因为检索
“text\u to\u display”
(编辑文本值)效果很好。还有一点值得注意:如果进程完全被终止(重新启动手机或FC),那么在进程终止后返回到小部件时,我在小部件中选择的颜色将保持该颜色,因此它似乎保存在
ColorDialogPreference.java
,但是在别的地方?

< P>请考虑使用这个颜色选择器:它可以用作首选项屏幕上的首选项。值将与您提供的键一起存储在共享首选项中

你也应该考虑清理你的代码。我的建议是将我的首选活动改为:

public class MyPreferencesActivity extends PreferenceActivity {

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getPreferenceManager().setSharedPreferencesName("sharedPreferencesFilename");
        addPreferencesFromResource(R.xml.prefs);

    }
}
这就是您需要的全部代码。您似乎不完全了解共享首选项的工作原理


您的代码不起作用,因为您正在为“preferenceKeyName”和“text_to_display”等文件写入首选项,但您正在从“prefs”读取它们。

很抱歉响应延迟。谢谢,但不幸的是,我只能获取我在
MyPreferencesActivity.java
中提供的默认颜色。恐怕我没有在服务中正确调用
prefs.xml
值。。。。顺便说一句,我已经编辑了我的原始帖子,以反映您脚本的更改(仅限代码)。这很有效!非常感谢你!是的,这个应用是我对共享偏好的介绍。>