0

我为我的幻灯片动态壁纸创建了一个首选项文件。
大部分来源都是从几个样本中复制而来的。我认为我正确地复制了它们,并且 Eclipse 没有显示我的源代码的警告或错误。
我的问题是当我选择动态壁纸时没有出现“设置”按钮。

我检查了非常接近的问题“无法获取设置按钮以显示动态壁纸”,但它并没有解决我的问题。

我怀疑我的清单或偏好来源有问题,但我找不到重点。

对不起,我的英语不好。

我的来源如下:

AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?>
<manifest package="sample.slide_wallpaper"
    android:versionCode="1"
    android:versionName="1.0"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">

        <!-- =========================================================== -->
        <!-- Launcher -->
        <activity android:name=".Launcher" android:label="@string/app_name"
            android:theme="@style/Theme.HalfTrans">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
        </activity>

        <!-- ==============================================================-->
        <!-- Live Wallpaper -->
        <service
            android:enabled="true"
            android:permission="android.permission.BIND_WALLPAPER"
            android:label="@string/app_name"
            android:name="SlideWallpaper"
            android:icon="@drawable/thumbnail">
            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService"></action>
            </intent-filter>
            <meta-data
                android:name="android.service.wallpaper"
                android:resource="@xml/wallpaper">
            </meta-data>
        </service>

        <!-- ================================================================= -->
        <!-- Preferences -->
        <activity
            android:name="sample.slide_wallpaper.Prefs"
            android:label="@string/wallpaper_settings"
            android:theme="@android:style/Theme.WallpaperSettings"
            android:exported="true">
            <intent-filter>
                <category android:name="android.intent.category.PREFERENCE" />
             </intent-filter>
        </activity>
    </application>
</manifest>

设置.xml

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:title="@string/wallpaper_settings"
            >
         <ListPreference
              android:key="timer_key"
              android:title="@string/list_title"
              android:summary="@string/list_summary"
              android:entries="@array/timer_pref"
              android:entryValues="@array/timer_pref_values"
              android:defaultValue="5000"
              />
    </PreferenceScreen>

**wallpaper.xml**

    <?xml version="1.0" encoding="utf-8" ?>
    <wallpaper xmlns:android="http://shemas.android.com/apk/res/android"
        android:thumbnail="@drawable/thumbnail"
        android:description="@string/description"
        android:settingsActivity="sample.slidewallpaper.Prefs"
        />

**Prefs.java**

    package sample.slide_wallpaper;

    import sample.slide_wallpaper.R;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.preference.PreferenceActivity;
    import android.util.Log;
    
    public class Prefs extends PreferenceActivity 
    implements  SharedPreferences.OnSharedPreferenceChangeListener {
    
    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        Log.w("Prefs", "prefs onCreate");
        addPreferencesFromResource(R.xml.settings);
    }

    @Override
    protected void onDestroy()
    {           
        getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
        super.onDestroy();
    }

        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
        {
        }
    }

SlideWallpaper.java

package sample.slide_wallpaper;
import java.util.Random;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.WindowManager;
import android.content.SharedPreferences;
import android.content.res.Resources;

//WallpaperService
public class SlideWallpaper extends WallpaperService {
        // Path for Prefs
        public static final String SHARED_PREFS_NAME = "sample.slide_wallpaper.Prefs";

    @Override
    public void onCreate() {
        .....
        super.onCreate();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public WallpaperService.Engine onCreateEngine() {
        return new WallpaperEngine(getResources());
    }

    //*********************************************************
    //Wallpaper Engine
    //*********************************************************
    public class WallpaperEngine extends Engine 
    implements SharedPreferences.OnSharedPreferenceChangeListener {
        private final Handler handler=new Handler();

        SharedPreferences prefs;

        public Bitmap img;
        private Bitmap images[] = new Bitmap[5];
        private Bitmap eximg;

        private final Random randGen = new Random();

        private static final String TAG = "WallpaperEngine";

        //timer
        private long timer = 5000;//interval(sec)×1000
        private long startTime = 0;

        private int currentAlpha;
        private final Paint imagePaint;

        private final Runnable drawThread=new Runnable() {
            public void run() {
                Log.d(TAG,"runnable");
                drawFrame();
            }
        };

    public WallpaperEngine(Resources r) {

        prefs=SlideWallpaper.this.getSharedPreferences(SHARED_PREFS_NAME, 0);
        prefs.registerOnSharedPreferenceChangeListener(this);

        images[0]=BitmapFactory.decodeResource(r,R.drawable.imgA);
        images[1]=BitmapFactory.decodeResource(r,R.drawable.imgB);
        images[2]=BitmapFactory.decodeResource(r,R.drawable.imgC);
        images[3]=BitmapFactory.decodeResource(r,R.drawable.imgD);
        images[4]=BitmapFactory.decodeResource(r,R.drawable.imgE);

        eximg = BitmapFactory.decodeResource(r,R.drawable.bg1);
        img = eximg;

        imagePaint = new Paint();
        imagePaint.setAlpha(255);
        }

    //=============================
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key){
        Log.w(TAG, "onPreferenceChanged");//this Log doesn't show up
        String listString = prefs.getString("timer_key", "5000");
        int listInt = Integer.parseInt(listString);
        timer = listInt;
    }
    //=================================
    @Override
    public void onCreate(SurfaceHolder surfaceHolder) {
        super.onCreate(surfaceHolder);
        Log.d(TAG, "onCreate");
        drawFrame();
    }

    //=====================================
    @Override
    public void onDestroy() {
        super.onDestroy();
        handler.removeCallbacks(fadeAnimate);
        handler.removeCallbacks(drawThread);
    }

    //==================================
    @Override
    public void onVisibilityChanged(boolean visible) {
        Log.d(TAG, "Visibility changed");
        if (visible) {
            if(nowTime() - startTime + 100 < timer){
                if (img.isRecycled()) {
                    img = eximg;
                }
                drawBitmap(img);
                handler.postDelayed(drawThread, timer - (nowTime() - startTime));
            }else {
                drawFrame();
            }
        } else {
            handler.removeCallbacks(fadeAnimate);
            handler.removeCallbacks(drawThread);
        }
    }

    //===================================================
    //draws bitmap
    private void drawBitmap(Bitmap b) {
    ............
    }

        //=========================
        @Override
        public void onSurfaceCreated(SurfaceHolder holder) {
            super.onSurfaceCreated(holder);
        }

        //============================
        @Override
        public void onSurfaceChanged(SurfaceHolder holder,
            int format,int width,int height) {
            super.onSurfaceChanged(holder,format,width,height);
            drawFrame();
        }

        //==============================
        @Override
        public void onSurfaceDestroyed(SurfaceHolder holder) {
            super.onSurfaceDestroyed(holder);
            handler.removeCallbacks(fadeAnimate);
            handler.removeCallbacks(drawThread);
        }

        //=================================
        @Override
        public void onOffsetsChanged(float xOffset,float yOffset,
            float xStep,float yStep,int xPixels,int yPixels) {
            drawBitmap(img);
        }

    //=================================================
    //Changes image==================================
    protected void drawFrame() {
    .....
    }

    private final Runnable fadeAnimate = new Runnable() {
        public void run() {
          fadeTransition(img, currentAlpha);
        }
    };

    private void fadeTransition(Bitmap b, int alpha) {
        .....
    }//END fadeTransition


    private long nowTime() {
        return System.nanoTime() / 1000000;
    }


}//Engine
}//END

我真的需要你的帮助!!

此外,缩略图图像不会显示在动态壁纸列表中。但这是一个小问题。

4

2 回答 2

1

您的 wallpaper.xml 有一个小错误。包名不正确。它应该是:

<?xml version="1.0" encoding="utf-8" ?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
    android:thumbnail="@drawable/thumbnail"
    android:description="@string/description"
    android:settingsActivity="sample.slide_wallpaper.Prefs"
    />
于 2012-06-25T12:53:00.120 回答
0

我自己解决了这个问题。感谢 Rajesh,我重写了“wallpaper.xml”的整个代码,它工作正常。实际上,我找不到区别,但我的修订版是这样的:

<?xml version="1.0" encoding="utf-8" ?>
<wallpaper
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:thumbnail="@drawable/thumbnail"
    android:description="@string/description"
    android:settingsActivity="sample.slide_wallpaper.Prefs"
/>

通过修改源,缩略图错误也显示出来了!

于 2012-06-26T02:18:46.500 回答