Пользовательский шрифт в виджете - PullRequest
3 голосов
/ 25 марта 2012

Я пытаюсь создать простой виджет для Android, который показывает время, но использует собственный шрифт.Кто-нибудь знает, как это сделать?Я пробовал это: Проблема с отображением времени с использованием пользовательского шрифта

Но это не будет работать.Сначала getAssets () не будет работать, потому что ему нужен контекст, и если через пару секунд я удалю строку, которая устанавливает пользовательский шрифт, я получу ошибку неудавшаяся операция связывания .

Кто-нибудь может помочь или дать мне ссылку на учебник?Также рекомендуется обновлять время с помощью таймера?

Мой код LWidget.java

public class LWidget extends AppWidgetProvider {

//=============================================================================================
//On Update
//=============================================================================================


    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
    int[] appWidgetIds) {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 1000);



        //views.setImageViewBitmap(R.id.TimeView, buildUpdate(time));





    }
//=============================================================================================
//Timer class
//=============================================================================================

    private class MyTime extends TimerTask {
        RemoteViews remoteViews;
        AppWidgetManager appWidgetManager;
        ComponentName thisWidget;
        DateFormat timeformat = new SimpleDateFormat("kk:mm");
        public MyTime(Context context, AppWidgetManager appWidgetManager) {
        this.appWidgetManager = appWidgetManager;
        remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
        thisWidget = new ComponentName(context, LWidget.class);
    }

    @Override
    public void run() {
        Calendar ci = Calendar.getInstance();
        String time = timeformat.format(ci.getTime());
        remoteViews.setTextViewText(R.id.widget_textview,"Time = " + time);
        remoteViews.setImageViewBitmap(R.id.widget_imageview, buildUpdate(time));
        appWidgetManager.updateAppWidget(thisWidget, remoteViews);
        }
    }

//=============================================================================================
//bitmap font
//=============================================================================================
    public Bitmap buildUpdate(String time) 
{
        Bitmap myBitmap = Bitmap.createBitmap(160, 84, Bitmap.Config.ARGB_4444);
        Canvas myCanvas = new Canvas(myBitmap);
        Paint paint = new Paint();

        //if I remove the comment here, getAssets() will not work

        //Typeface clock = Typeface.createFromAsset(this.getAssets(),"fonts/Crysta.ttf");
        paint.setAntiAlias(true);
        paint.setSubpixelText(true);
       // paint.setTypeface(clock);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.WHITE);
        paint.setTextSize(65);
        paint.setTextAlign(Align.CENTER);
        myCanvas.drawText(time, 80, 60, paint);
        return myBitmap;
 }




//=============================================================================================
//On receive
//=============================================================================================
@Override
    public void onReceive(Context context, Intent intent) {
            // v1.5 fix that doesn't call onDelete Action
            final String action = intent.getAction();
            if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
            final int appWidgetId = intent.getExtras().getInt(
            AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);
            if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
                this.onDeleted(context, new int[] { appWidgetId });
            }
            } else {
                super.onReceive(context, intent);
            }
    }

}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:orientation="vertical"
android:layout_gravity="center"
android:layout_height="wrap_content">

<TextView android:id="@+id/widget_textview"
android:text="@string/widget_text"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal|center"
android:layout_marginTop="5dip"
android:padding="10dip"
android:textColor="@android:color/black"/>

<ImageView 
   android:id="@+id/widget_imageview"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   />

</LinearLayout>

ltime_widget_provider.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="146dip"
android:minHeight="72dip"
android:updatePeriodMillis="10000"
android:initialLayout="@layout/main"
/>

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Вы должны использовать AlarmManager вместо таймера.Вы не можете использовать Таймер , потому что :

AppWidgetProvider является расширением BroadcastReceiver, ваш процесс не гарантированно продолжит работу после возврата методов обратного вызова.

Используйте код здесь для справки.

getAssets () не будет работать, поскольку ему нужен контекст

onUpdate() дает Context, нет?

0 голосов
/ 08 апреля 2015

хорошо, попробуйте так:

static Context con;  

Typeface clock = Typeface.createFromAsset(con.getAssets(),"fonts/KacstLetter.ttf");
...