【问题标题】:Android Widget Works in Lollipop, but NOT in KitKatAndroid Widget 在 Lollipop 中有效,但在 KitKat 中无效
【发布时间】:2015-10-25 18:05:42
【问题描述】:

我有一个时钟小部件,每分钟更新一次。它呈现位图并替换图像视图。这是在小部件中使用自定义字体。下面我展示了我的代码的重要部分。我的问题是小部件在那里,但没有出现。我仍然可以点击小部件来调出设置,所以我知道它就在那里。就像服务更新在 Kitkat 中无法正常工作,但在 Lollipop 中却可以。有什么建议吗?

public class DigitalClockWidget_2x1 extends AppWidgetProvider {   
public RemoteViews mRemoteViews;
static String APP_SETTINGS = "8BitSettings";

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    context.startService(new Intent(UpdateTimeService.UPDATE_TIME));
}



@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);       
    mRemoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);        
    Intent LaunchIntent = getLaunchIntent(context);
    PendingIntent clickPendIntent = PendingIntent.getActivity(context, 0, LaunchIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    mRemoteViews.setOnClickPendingIntent(R.id.widget_root, clickPendIntent);
    ComponentName componentName = new ComponentName(context.getPackageName(),DigitalClockWidget_2x1.class.getName());
    appWidgetManager.updateAppWidget(componentName, mRemoteViews);
    context.startService(new Intent(UpdateTimeService.UPDATE_TIME));



}

public static Intent getLaunchIntent(Context context){
    SharedPreferences clockSettings = context.getSharedPreferences("ClockSettings", 0);
    String launchString = clockSettings.getString("tappedAction", APP_SETTINGS);
    if(launchString.compareTo(APP_SETTINGS) == 0){
        return new Intent(context, SettingsPage.class);
    }
    return context.getPackageManager().getLaunchIntentForPackage(launchString);

}

public static final class UpdateTimeService extends Service {
    static final String UPDATE_TIME = "org.penguinproductions.eight_bit_clock.action.UPDATE_TIME_2x1";
    RemoteViews mRemoteViews;
    private Calendar mCalendar;
    private final static IntentFilter mIntentFilter = new IntentFilter();
    int textColor = 0;
    boolean tweentyfourHour = false;
    SharedPreferences clockSettings;
    String APP_SETTINGS = "8BitSettings";

    static {
        mIntentFilter.addAction(Intent.ACTION_TIME_TICK);
        mIntentFilter.addAction(Intent.ACTION_TIME_CHANGED);
        mIntentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
    }

    @Override
    public void onCreate() {
        super.onCreate();           
        mCalendar = Calendar.getInstance();
        registerReceiver(mTimeChangedReceiver, mIntentFilter);
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        if (intent != null) {
            if (UPDATE_TIME.equals(intent.getAction())) {
                updateTime();
            }
        }

        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private final BroadcastReceiver mTimeChangedReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {                
            updateTime();
        }
    };

    private void updateTime() {

        mCalendar.setTimeInMillis(System.currentTimeMillis());

        mRemoteViews = new RemoteViews(getPackageName(), R.layout.widget);

        String date = DateFormat.format(getString(R.string.date_format), mCalendar).toString();

        mRemoteViews.setImageViewBitmap(R.id.imageView_txt, buildUpdate(getTodaysTime(), mCalendar.get(Calendar.AM_PM), date));

        ComponentName mComponentName = new ComponentName(this, DigitalClockWidget_2x1.class);
        AppWidgetManager mAppWidgetManager = AppWidgetManager.getInstance(this);
        mAppWidgetManager.updateAppWidget(mComponentName, mRemoteViews);



        Intent LaunchIntent = getLaunchIntent(getBaseContext());
        PendingIntent clickPendIntent = PendingIntent.getActivity(getBaseContext(), 0, LaunchIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mRemoteViews.setOnClickPendingIntent(R.id.widget_root, clickPendIntent);
       mAppWidgetManager = AppWidgetManager.getInstance(getBaseContext());
        mAppWidgetManager.updateAppWidget(mComponentName, mRemoteViews);
    }
}

编辑:

问题似乎与位图渲染有关。我用 textview 替换了 imageview 并且它起作用了。所以 Bitmap 不在 KitKat 中显示,但在 Lollipop 中显示

public Bitmap buildUpdate(String time, int AMPM, String date) {
         Log.v("Penguin", "Building time string:" + time);

        clockSettings = this.getSharedPreferences("ClockSettings", 0);
        boolean showDate = clockSettings.getBoolean("showDate", true);
        boolean showampm = clockSettings.getBoolean("ampm", true);
        boolean leading0 = clockSettings.getBoolean("leading0", true);
        textColor = clockSettings.getInt("clockColor", Color.WHITE);
        int dateColor = clockSettings.getInt("dateColor", Color.WHITE);



        Bitmap myBitmap = Bitmap.createBitmap(2500, 1100, Bitmap.Config.ARGB_8888);

        int fontSize = 425;
        Canvas myCanvas = new Canvas(myBitmap);
        Paint paint = new Paint();
        Typeface clock = Typeface.createFromAsset(this.getAssets(), "fonts/PressStart2P.ttf");
        paint.setAntiAlias(true);
        paint.setSubpixelText(true);
        paint.setTypeface(clock);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(textColor);

        paint.setTextSize(fontSize);
        paint.setTextAlign(Paint.Align.CENTER);

        myCanvas.drawText(time, myBitmap.getWidth() / 2, fontSize+200, paint);

        paint.setTextSize(100);
        if(showampm) {
            // alert("AMPM");
            String ampm = "AM";
            if (AMPM == 1) ampm = "PM";
            myCanvas.drawText(ampm, (myBitmap.getWidth() / 2) + ((time.length() * fontSize) / 2) + 100, 300, paint);
        }

        paint.setTextSize(125);

        if(showDate) {
            paint.setColor(dateColor);
            myCanvas.drawText(date, myBitmap.getWidth() / 2, (myBitmap.getHeight() / 2 + 400), paint);
        }
        return myBitmap;
    }

【问题讨论】:

    标签: android android-widget android-5.0-lollipop android-4.4-kitkat


    【解决方案1】:

    所以问题是我运行 KitKat 的旧手机的尺寸限制只允许纹理尺寸不大于 2048x2048 像素。我的位图是 2500x1100,所以缩小它已经解决了这个问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 2020-10-23
      • 1970-01-01
      相关资源
      最近更新 更多