2013-10-05 84 views
0

我在執行此color picker到我的動態壁紙時遇到問題。它可以獨立工作(我可以將它添加到我的首選項菜單中,打開窗口小部件並選擇一種顏色),但是我想使用該選定的顏色來詳細說明用戶將看到的EditText字段主屏幕畫布。我可以很容易地通過改變ColorDialogPreference.java'sint color靜態變量,直接從WallpaperService類調用它實現這一目標:自定義ColorDialogPreference - 保存/檢索爲共享首選項

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

但因爲它是靜態的,顏色被重置一次的過程中被破壞。

我試過通過我的PreferencesActivity.java(見下面)中的SharedPreferences編輯器保存變量,但似乎無法在WallpaperService類中檢索該變量。

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); 
} 
} 

WallpaperService.java:

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 
} 
} 
} 

而且我的prefs.xml:

`<?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」。我知道PreferencesActivity在某種程度上起作用,因爲檢索"text_to_display"這是一個EditText值,工作得很好。值得注意的是:如果進程完全死亡(重新啓動手機或FC),如果我在進程終止後返回到小部件,則在widget中選擇的顏色保持該顏色,所以它似乎是保存在ColorDialogPreference.java裏面,但沒有其他地方?

回答

0

請考慮使用這個顏色選擇器:github.com/chiralcode/Android-Color-Picker。它可以用作PreferenceScreen的首選項。價值將存儲在您提供的密鑰的共享首選項中。

你也應該考慮清理你的代碼。我的建議是將MyPreferencesActivity更改爲:

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」等文件編寫首選項,但是您正在從「首選項」中讀取它們。

+0

對不起,延遲響應。謝謝,但不幸的是,我只能夠獲取我在'MyPreferencesActivity.java'中提供的默認顏色。恐怕我沒有在Service中正確調用'prefs.xml'或'key'值....我編輯了我的原始文章,以反映腳本的變化,btw(僅限代碼)。 – Geoff

+0

請參閱我編輯的答案。 –

+0

工作正常!非常感謝!是的,這個應用程序是我介紹共享偏好。 >< – Geoff