一个应用程序窗口小部件使用收集的更新问题 [英] Update issue of an app widget using collection

查看:216
本文介绍了一个应用程序窗口小部件使用收集的更新问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建使用收集我的应用程序的应用程序插件,该插件显示的日期和项目的名单在那个特定的日期。一切工作正常,窗口小部件正在更新的要求,但有时同时改变了插件的日点击next和previous按钮发生什么,列表不会刷新意味着项目不更新,在那个特定的日期。此行为是随机的,它的出现有时只。那么,为什么出现这种情况,什么错在我的code。

code,我有使用方法是:

WidgetProvider.class

 公共类WidgetProvider扩展AppWidgetProvider
{
    私人ThemeManager m_ThemeManagerObject;

    私有静态字符串WIDGET_NEXT_BUTTON =in.test.widgetApp.WIDGET_NEXT_BUTTON;

    私有静态字符串WIDGET_ preV_BUTTON =in.test.widgetApp.WIDGET_ preV_BUTTON;

    @覆盖
    公共无效的OnUpdate(上下文的背景下,AppWidgetManager appWidgetManager,INT [] appWidgetIds)
    {
        super.onUpdate(背景下,appWidgetManager,appWidgetIds);

        //设置日期为当前日期
        NoteManager.getSingletonObject()setWidgetToCurrentDate()。

        // code更新部件由当前的日期
        updateAppWidget(上下文,AppWidgetManager.getInstance(上下文),appWidgetIds);
    }

    @覆盖
    公共无效的onReceive(上下文的背景下,意图意图)
    {
        super.onReceive(背景下,意图);

        INT numOfDays = 1;

        组件名thisWidget =新的组件名(背景下,WidgetProvider.class);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(上下文);
        INT [] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

        如果(intent.getAction()。等于(WIDGET_NEXT_BUTTON))
        {
            //加一无天
            //更新窗口小部件由新的日期
            NoteManager.getSingletonObject()setWidgetDate(numOfDays)。
            updateAppWidget(上下文,AppWidgetManager.getInstance(上下文),appWidgetIds);
        }
        否则,如果(intent.getAction()。等于(WIDGET_ preV_BUTTON))
        {
            //一个没有减少的天
            //更新窗口小部件由新的日期
            NoteManager.getSingletonObject()setWidgetDate(-numOfDays)。
            updateAppWidget(上下文,AppWidgetManager.getInstance(上下文),appWidgetIds);
        }
    }

        公共无效updateAppWidget(上下文的背景下,AppWidgetManager appWidgetManager,INT [] appWidgetIds)
{
    //获取所有页面视图的文件夹路径
    ContextWrapper CW =新ContextWrapper(context.getApplicationContext());
    文件customDirectoryPath = cw.getDir(Utilities.CUSTOM_DIRECTORY_NAME_ preFIX,Context.MODE_PRIVATE);
    文件allPageDirectoryPath =新的文件(customDirectoryPath.getPath()+/+ Uti​​lities.All_PAGE_DIRECTORY_NAME_ preFIX);

    如果(!(allPageDirectoryPath.exists()))
        allPageDirectoryPath.mkdirs();

    //创建ThemeManager类的单一对象
    m_ThemeManagerObject = ThemeManager.getSingletonObject();
    m_ThemeManagerObject.readTheme(allPageDirectoryPath.getPath());

    //创建的SimpleDateFormat类的一个实例
    SimpleDateFormat的dateFormater =新的SimpleDateFormat(DD-MMM,EEE,Locale.US);

    / *通过所有部件的实例循环* /
    对于(INT为widgetid:appWidgetIds)
    {
        //创建远程视图类的一个实例
        RemoteViews远程视窗=新RemoteViews(context.getPackageName(),R.layout.widget_list);
        意图svcIntent =新的意图(背景下,WidgetService.class);
        svcIntent.setData(Uri.fromParts(内容,将String.valueOf(为widgetid),NULL));
        remoteView.setRemoteAdapter(R.id.widget_list,svcIntent);

        //显示日,月和星期的小部件内
        remoteView.setTextViewText(R.id.txt_date,dateFormater.format(NoteManager.getSingletonObject()getWidgetDate()的getTime())。。);

        //如果该列表为空。显示与juswrite图标和放空工具;空文本用户
        remoteView.setEmptyView(R.id.widget_list,R.id.widget_empty_text);

        //单击下一步按钮
        意图nextButtonIntent =新的意图(WIDGET_NEXT_BUTTON);
        / *使用为widgetid作为第二个参数 - 它帮助我更好地满足特定的小部件实例* /
        PendingIntent nextButtonPendingIntent = PendingIntent.getBroadcast(背景下,为widgetid,nextButtonIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.btn_next_month,nextButtonPendingIntent);
        remoteView.setInt(R.id.btn_next_monthsetBackgroundResource,m_ThemeManagerObject.getNextButtonBgImage());

        //在点击了previous按钮
        意图prevButtonIntent =新的意向书(WIDGET_ preV_BUTTON);
        / *使用为widgetid作为第二个参数 - 同上* /
        PendingIntent prevButtonPendingIntent = PendingIntent.getBroadcast(背景下,为widgetid,prevButtonIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.btn_ prev_month,prevButtonPendingIntent);
        remoteView.setInt(R.id.btn_ prev_month,setBackgroundResource,m_ThemeManagerObject.get prevButtonBgImage());

        //在点击应用程序插件的开放应用
        意图clickIntent =新的意图(背景下,AllPageViewActivity.class);
        PendingIntent clickPI = PendingIntent.getActivity(上下文,0,clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.widget_empty_text,clickPI);
        remoteView.setOnClickPendingIntent(R.id.txt_date,clickPI);

        / *在同一时间更新了一个构件,例如* /
        appWidgetManager.updateAppWidget(为widgetid,远程视窗)
    }
}
}
 

WidgetService.class

 公共类WidgetService扩展RemoteViewsService
{
    @覆盖
    公共RemoteViewsFactory onGetViewFactory(意向意图)
    {
        返程(新WidgetDisplay(this.getApplicationContext(),意图));
    }
}
 

WidgetDisplay.class

 公共类WidgetDisplay工具RemoteViewsService.RemoteViewsFactory
{
    私人文件m_CustomDirectoryPath,m_AllPageDirectoryPath;

    私人NoteManager m_NoteManagerObject;

    私人ThemeManager m_ThemeManagerObject;

    私人的ArrayList<字符串> m_AlarmItemNameArrayList;

    私人的ArrayList<整数GT; m_ItemIndexArray;

    民营背景ctxt = NULL;

    INT appWidgetId;

    位图canvasBackground;

    公共WidgetDisplay(上下文ctxt,意图意图)
    {
        this.ctxt = ctxt;

        appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);

        setImageInView(this.ctxt);

    }

    私人无效setImageInView(上下文的背景下)
    {
        ContextWrapper CW =新ContextWrapper(ctxt.getApplicationContext());
        m_CustomDirectoryPath = cw.getDir(Utilities.CUSTOM_DIRECTORY_NAME_ preFIX,Context.MODE_PRIVATE);
        m_AllPageDirectoryPath =新的文件(m_CustomDirectoryPath.getPath()+/+ Uti​​lities.All_PAGE_DIRECTORY_NAME_ preFIX);

        m_NoteManagerObject = NoteManager.getSingletonObject();
        m_ThemeManagerObject = ThemeManager.getSingletonObject();

        m_NoteManagerObject.readSettings(m_AllPageDirectoryPath.getPath());
        m_NoteManagerObject.readAllPageChangesFromFile(m_AllPageDirectoryPath.getPath());
        m_NoteManagerObject.readAlarmFromFile(m_AllPageDirectoryPath.getPath());
        m_ThemeManagerObject.readTheme(m_AllPageDirectoryPath.getPath());

        m_AlarmItemNameArrayList =新的ArrayList<字符串>(m_NoteManagerObject.getAlarmCount());
        m_ItemIndexArray =新的ArrayList&其中;整数>(m_NoteManagerObject.getAlarmCount());

        SimpleDateFormat的sdFormatter =新的SimpleDateFormat(DD-MMM-YYYY,Locale.US);
        串selectedDate = sdFormatter.format(m_NoteManagerObject.getWidgetDate());

        的for(int i = 0; I< m_NoteManagerObject.getAlarmCount();我++)
        {
            字符串ArrayDate = sdFormatter.format(m_NoteManagerObject.getAlarmTime(一));
            如果(selectedDate.equals(ArrayDate))
            {
                文件noteDirectoryPath =新的文件(m_CustomDirectoryPath.getPath()+/+ m_NoteManagerObject.getAlarmFolder(一));
                m_AlarmItemNameArrayList.add(noteDirectoryPath.getPath()+/+ m_NoteManagerObject.getAlarmItem(ⅰ));

                m_ItemIndexArray.add(ⅰ);
            }
        }
    }

    @覆盖
    公众诠释getCount将()
    {
        返回(m_AlarmItemNameArrayList.size());
    }

    @覆盖
    公共RemoteViews getViewAt(INT位置)
    {
        新ImageLoaderTask(位置).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

        //设置使用远程视图实例结合图像的图像视图
        RemoteViews远程视窗=新RemoteViews(ctxt.getPackageName(),R.layout.widget_list_item);
        remoteView.setImageViewBitmap(R.id.image_view,canvasBackground);

        //使用远程视图实例设置时间文本视图
        SimpleDateFormat的timeFormater;

        如果(m_NoteManagerObject.get24HourFormat())
        {
            timeFormater =新的SimpleDateFormat(HH:MM,Locale.US);
        }
        其他
        {
            timeFormater =新的SimpleDateFormat(HH:mm的,Locale.US);
        }

        //显示时间上的每个图像视图的顶部
        字符串时间= timeFormater.format(m_NoteManagerObject.getAlarmTime(m_ItemIndexArray.get(位置)));
        remoteView.setTextViewText(R.id.text_alarm_time,时间);

        意图clickIntent =新的意图(ctxt,AllPageViewActivity.class);
        PendingIntent clickPI = PendingIntent.getActivity(ctxt,0,clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.image_view,clickPI);

        返回(远程视窗)
    }

    类ImageLoaderTask扩展的AsyncTask< URL,为Integer,Long>
    {
        私人诠释的位置;

        ImageLoaderTask(IN​​T位置)
        {
            this.position =位置;
        }

        @覆盖
        在preExecute保护无效()
        {
            //获取前景和背景图片
            。位图的BitmapImage = BitmapFactory.de codeFILE(m_AlarmItemNameArrayList.get(位置))复印件(Bitmap.Config.ARGB_8888,真正的);
            canvasBackground = BitmapFactory.de codeResource(ctxt.getResources(),m_ThemeManagerObject.getWidgetListItemBgImage(m_ItemIndexArray.get(位置),的BitmapImage))复印件(Bitmap.Config.ARGB_8888,真)。

            //缩放前景图像,并结合与背景图像
            的BitmapImage = Bitmap.createScaledBitmap(BitmapImage的,380,bitmapImage.getHeight()/ 2,真);
            帆布comboImage =新的Canvas(canvasBackground);
            comboImage.drawBitmap(BitmapImage的,0F,0F,NULL);
        }

        @覆盖
        保护龙doInBackground(网址...网址)
        {
            返回null;
        }

        @覆盖
        保护无效onProgressUpdate(整数...进度)
        {

        }

        @覆盖
        保护无效onPostExecute(长效)
        {

        }
    }

    @覆盖
    公共无效的onCreate(){
    }

    @覆盖
    公共无效的onDestroy(){
    }

    @覆盖
    公共RemoteViews getLoadingView()
    {
        返程(空);
    }

    @覆盖
    公众诠释getViewTypeCount(){
        返回(1);
    }

    @覆盖
    众长getItemId(INT位置){
        返回(位置);
    }

    @覆盖
    公共布尔hasStableIds(){
        返回(真);
    }

    @覆盖
    公共无效onDataSetChanged(){
    }
}
 

解决方案

WidgetProvider.class

 公共类WidgetProvider扩展AppWidgetProvider
{
    私人NoteManager m_NoteManagerObject;

    私人ThemeManager m_ThemeManagerObject;

    私人的SimpleDateFormat m_DateFormater;

    私有静态字符串WIDGET_NEXT_BUTTON =in.test.widgetApp.WIDGET_NEXT_BUTTON;

    私有静态字符串WIDGET_ preV_BUTTON =in.test.widgetApp.WIDGET_ preV_BUTTON;

    公共WidgetProvider()
    {
        //创建NoteManager类的单一对象
        m_NoteManagerObject = NoteManager.getSingletonObject();
        //创建ThemeManager类的单一对象
        m_ThemeManagerObject = ThemeManager.getSingletonObject();
        //创建的SimpleDateFormat类的一个实例
        m_DateFormater =新的SimpleDateFormat(DD-MMM,EEE,Locale.US);
    }

    @覆盖
    公共无效的OnUpdate(上下文的背景下,AppWidgetManager appWidgetManager,INT [] appWidgetIds)
    {
        super.onUpdate(背景下,appWidgetManager,appWidgetIds);

        //设置日期为当前日期
        m_NoteManagerObject.setWidgetToCurrentDate();

        //获取所有页面视图的文件夹路径
        ContextWrapper CW =新ContextWrapper(context.getApplicationContext());
        文件customDirectoryPath = cw.getDir(Utilities.CUSTOM_DIRECTORY_NAME_ preFIX,Context.MODE_PRIVATE);
        文件allPageDirectoryPath =新的文件(customDirectoryPath.getPath()+/+ Uti​​lities.All_PAGE_DIRECTORY_NAME_ preFIX);

        如果(!(allPageDirectoryPath.exists()))
            allPageDirectoryPath.mkdirs();

        m_ThemeManagerObject.readTheme(allPageDirectoryPath.getPath());

        //设置启动该WidgetService的意图,这将
        //为这个集合的看法。
        //当意图进行比较时,演员会被忽略,所以我们需要嵌入演员
        //成这样的演员将是不容忽视的数据。
        意向意图=新的意图(背景下,WidgetService.class);
        intent.setData(Uri.fromParts(内容,将String.valueOf(appWidgetIds),NULL));

        //实例化RemoteViews对象的应用程序窗口小部件的布局。
        //设置了RemoteViews对象使用一个RemoteViews适配器。
        //这适配器通过指定的意图连接到RemoteViewsService。
        //这是你如何填充数据。
        RemoteViews远程视窗=新RemoteViews(context.getPackageName(),R.layout.widget_list);
        remoteView.setRemoteAdapter(R.id.widget_list,意图);

        //显示日,月和星期的小部件内
        remoteView.setTextViewText(R.id.txt_date,m_DateFormater.format(m_NoteManagerObject.getWidgetDate()的getTime())。);

        //当集合有没有项目显示空视图。
        remoteView.setEmptyView(R.id.widget_list,R.id.widget_empty_text);

        //单击下一步按钮
        //这个部分可以使项目具有个性化的行为。
        //设置为目的的行动。
        //当用户触摸的特定视图,则其效果
        //广播行动。
        意图nextButtonIntent =新的意图(背景下,WidgetProvider.class);
        nextButtonIntent.setAction(WIDGET_NEXT_BUTTON);
        PendingIntent nextButtonPendingIntent = PendingIntent.getBroadcast(上下文,0,nextButtonIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.btn_next_month,nextButtonPendingIntent);
        remoteView.setInt(R.id.btn_next_monthsetBackgroundResource,m_ThemeManagerObject.getNextButtonBgImage());

        //在点击了previous按钮
        //这个部分可以使项目具有个性化的行为。
        //设置为目的的行动。
        //当用户触摸的特定视图,则其效果
        //广播行动。
        意图prevButtonIntent =新的意图(背景下,WidgetProvider.class);
        prevButtonIntent.setAction(WIDGET_ preV_BUTTON);
        PendingIntent prevButtonPendingIntent = PendingIntent.getBroadcast(背景下,0,prevButtonIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.btn_ prev_month,prevButtonPendingIntent);
        remoteView.setInt(R.id.btn_ prev_month,setBackgroundResource,m_ThemeManagerObject.get prevButtonBgImage());

        //在点击应用程序插件的开放应用
        意图clickIntent =新的意图(背景下,AllPageViewActivity.class);
        PendingIntent clickPI = PendingIntent.getActivity(上下文,0,clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.widget_empty_text,clickPI);
        remoteView.setOnClickPendingIntent(R.id.txt_date,clickPI);

        appWidgetManager.updateAppWidget(appWidgetIds,远程视窗)
    }

    @覆盖
    公共无效的onReceive(上下文的背景下,意图意图)
    {
        super.onReceive(背景下,意图);

        INT numOfDays = 1;

        组件名thisWidget =新的组件名(背景下,WidgetProvider.class);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(上下文);
        INT [] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

        如果(intent.getAction()。等于(WIDGET_NEXT_BUTTON))
        {
            //加一无天
            m_NoteManagerObject.setWidgetDate(numOfDays);

            //更新远程视图
            RemoteViews远程视窗=新RemoteViews(context.getPackageName(),R.layout.widget_list);
            remoteView.setTextViewText(R.id.txt_date,m_DateFormater.format(m_NoteManagerObject.getWidgetDate()的getTime())。);
            appWidgetManager.updateAppWidget(appWidgetIds,远程视窗)

            //更新列表中的小窗口的内容
           //这将调用WidgetDisplay类onDataSetChanged()方法
            appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds,R.id.widget_list);
        }
        否则,如果(intent.getAction()。等于(WIDGET_ preV_BUTTON))
        {
            //一个没有减少的天
            m_NoteManagerObject.setWidgetDate(-numOfDays);

            //更新远程视图
            RemoteViews远程视窗=新RemoteViews(context.getPackageName(),R.layout.widget_list);
            remoteView.setTextViewText(R.id.txt_date,m_DateFormater.format(m_NoteManagerObject.getWidgetDate()的getTime())。);
            appWidgetManager.updateAppWidget(appWidgetIds,远程视窗)

            //更新列表中的小窗口的内容
              //这将调用WidgetDisplay类onDataSetChanged()方法
            appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds,R.id.widget_list);
        }
    }
}
 

I have created an app widget using collection for my app, The widget shows date and list of item on that particular date. Everything works fine and the widget are updating as required, But sometimes what happen while changing the date in the widget by clicking next and previous button, the list is not refresh means the items are not updated on that particular date. This behaviour is random and its occur sometimes only. So why this happen, anything wrong in my code.

Code that i have use is:

WidgetProvider.class

public class WidgetProvider extends AppWidgetProvider 
{   
    private ThemeManager    m_ThemeManagerObject;

    private static String   WIDGET_NEXT_BUTTON = "in.test.widgetApp.WIDGET_NEXT_BUTTON";

    private static String   WIDGET_PREV_BUTTON = "in.test.widgetApp.WIDGET_PREV_BUTTON";    

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    {               
        super.onUpdate(context, appWidgetManager, appWidgetIds);

        // Set Date to current Date
        NoteManager.getSingletonObject().setWidgetToCurrentDate();

        // Code to update the widget by current date 
        updateAppWidget(context, AppWidgetManager.getInstance(context), appWidgetIds);
    }   

    @Override
    public void onReceive(Context context, Intent intent) 
    {           
        super.onReceive(context, intent);

        int numOfDays = 1;

        ComponentName thisWidget = new ComponentName(context, WidgetProvider.class);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

        if (intent.getAction().equals(WIDGET_NEXT_BUTTON)) 
        {
            // Increase no of days by one
            // Update the widget by new date 
            NoteManager.getSingletonObject().setWidgetDate(numOfDays);          
            updateAppWidget(context, AppWidgetManager.getInstance(context), appWidgetIds);
        }   
        else if (intent.getAction().equals(WIDGET_PREV_BUTTON)) 
        {
            // Decrease no of days by one
            // Update the widget by new date 
            NoteManager.getSingletonObject().setWidgetDate(-numOfDays);         
            updateAppWidget(context, AppWidgetManager.getInstance(context), appWidgetIds);
        }                   
    }

        public void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
    // Get the folder path of all-page-view
    ContextWrapper cw = new ContextWrapper(context.getApplicationContext());
    File customDirectoryPath = cw.getDir(Utilities.CUSTOM_DIRECTORY_NAME_PREFIX, Context.MODE_PRIVATE);
    File allPageDirectoryPath = new File(customDirectoryPath.getPath() + "/" + Utilities.All_PAGE_DIRECTORY_NAME_PREFIX); 

    if (!(allPageDirectoryPath.exists()))
        allPageDirectoryPath.mkdirs();

    // Create an singleton object of ThemeManager class
    m_ThemeManagerObject = ThemeManager.getSingletonObject();
    m_ThemeManagerObject.readTheme(allPageDirectoryPath.getPath());

    // Create an instance of SimpleDateFormat class
    SimpleDateFormat dateFormater = new SimpleDateFormat("dd-MMM, EEE", Locale.US);

    /* loop through all widget instances */
    for (int widgetId : appWidgetIds) 
    { 
        // Create an instance of remote view class
        RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_list);       
        Intent svcIntent = new Intent(context, WidgetService.class);
        svcIntent.setData(Uri.fromParts("content", String.valueOf(widgetId), null));        
        remoteView.setRemoteAdapter(R.id.widget_list, svcIntent);   

        // Show day, month and week day inside the widget
        remoteView.setTextViewText(R.id.txt_date, dateFormater.format(NoteManager.getSingletonObject().getWidgetDate().getTime()));

        // If the list is empty. Show empty widget with juswrite-icon & empty text to the user          
        remoteView.setEmptyView(R.id.widget_list, R.id.widget_empty_text);              

        // On click of next button
        Intent nextButtonIntent = new Intent(WIDGET_NEXT_BUTTON);
        /* use widgetId as second parameter - it helped me to better address particular widget instance */
        PendingIntent nextButtonPendingIntent = PendingIntent.getBroadcast(context, widgetId, nextButtonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.btn_next_month, nextButtonPendingIntent);
        remoteView.setInt(R.id.btn_next_month, "setBackgroundResource", m_ThemeManagerObject.getNextButtonBgImage());

        // On click of previous button
        Intent prevButtonIntent = new Intent(WIDGET_PREV_BUTTON);
        /* use widgetId as second parameter - same as above */
        PendingIntent prevButtonPendingIntent = PendingIntent.getBroadcast(context, widgetId, prevButtonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.btn_prev_month, prevButtonPendingIntent);
        remoteView.setInt(R.id.btn_prev_month, "setBackgroundResource", m_ThemeManagerObject.getPrevButtonBgImage());

        // Open application on click of app widget
        Intent clickIntent = new Intent(context, AllPageViewActivity.class);
        PendingIntent clickPI = PendingIntent.getActivity(context, 0,clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.widget_empty_text, clickPI);
        remoteView.setOnClickPendingIntent(R.id.txt_date, clickPI);

        /* update one widget instance at a time*/
        appWidgetManager.updateAppWidget(widgetId, remoteView);
    }
}
}

WidgetService.class

public class WidgetService extends RemoteViewsService 
{
    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) 
    {
        return(new WidgetDisplay(this.getApplicationContext(), intent));
    }
}

WidgetDisplay.class

public class WidgetDisplay implements RemoteViewsService.RemoteViewsFactory
{
    private File m_CustomDirectoryPath, m_AllPageDirectoryPath;

    private NoteManager m_NoteManagerObject;

    private ThemeManager m_ThemeManagerObject;

    private ArrayList<String>   m_AlarmItemNameArrayList;

    private ArrayList<Integer>  m_ItemIndexArray;

    private Context ctxt=null;

    int appWidgetId;

    Bitmap canvasBackground;

    public WidgetDisplay(Context ctxt, Intent intent) 
    {
        this.ctxt=ctxt;

        appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);

        setImageInView(this.ctxt);

    }

    private void setImageInView(Context context) 
    {
        ContextWrapper cw = new ContextWrapper(ctxt.getApplicationContext());
        m_CustomDirectoryPath = cw.getDir(Utilities.CUSTOM_DIRECTORY_NAME_PREFIX, Context.MODE_PRIVATE);
        m_AllPageDirectoryPath = new File(m_CustomDirectoryPath.getPath() + "/" + Utilities.All_PAGE_DIRECTORY_NAME_PREFIX); 

        m_NoteManagerObject = NoteManager.getSingletonObject();
        m_ThemeManagerObject = ThemeManager.getSingletonObject();

        m_NoteManagerObject.readSettings(m_AllPageDirectoryPath.getPath());
        m_NoteManagerObject.readAllPageChangesFromFile(m_AllPageDirectoryPath.getPath());
        m_NoteManagerObject.readAlarmFromFile(m_AllPageDirectoryPath.getPath());
        m_ThemeManagerObject.readTheme(m_AllPageDirectoryPath.getPath());

        m_AlarmItemNameArrayList = new ArrayList<String>(m_NoteManagerObject.getAlarmCount());
        m_ItemIndexArray = new ArrayList<Integer>(m_NoteManagerObject.getAlarmCount());

        SimpleDateFormat sdFormatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.US);      
        String selectedDate = sdFormatter.format(m_NoteManagerObject.getWidgetDate());

        for(int i=0; i<m_NoteManagerObject.getAlarmCount(); i++)
        {
            String ArrayDate = sdFormatter.format(m_NoteManagerObject.getAlarmTime(i));         
            if(selectedDate.equals(ArrayDate))
            {
                File noteDirectoryPath = new File(m_CustomDirectoryPath.getPath() + "/" + m_NoteManagerObject.getAlarmFolder(i));
                m_AlarmItemNameArrayList.add(noteDirectoryPath.getPath() + "/" + m_NoteManagerObject.getAlarmItem(i));

                m_ItemIndexArray.add(i);
            }
        }
    }

    @Override
    public int getCount() 
    {
        return(m_AlarmItemNameArrayList.size());
    }

    @Override
    public RemoteViews getViewAt(int position) 
    {       
        new ImageLoaderTask(position).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

        // Set combine image to the image view using remote view instance
        RemoteViews remoteView = new RemoteViews(ctxt.getPackageName(), R.layout.widget_list_item);
        remoteView.setImageViewBitmap(R.id.image_view, canvasBackground);

        // Set time text view using remote view instance
        SimpleDateFormat timeFormater;

        if(m_NoteManagerObject.get24HourFormat())
        {
            timeFormater = new SimpleDateFormat("HH:mm", Locale.US);
        }
        else
        {
            timeFormater = new SimpleDateFormat("hh:mm a", Locale.US );
        }

        // Show time on the top of each image view
        String time = timeFormater.format(m_NoteManagerObject.getAlarmTime(m_ItemIndexArray.get(position)));            
        remoteView.setTextViewText(R.id.text_alarm_time,  time);        

        Intent clickIntent = new Intent(ctxt, AllPageViewActivity.class);
        PendingIntent clickPI=PendingIntent.getActivity(ctxt, 0,clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.image_view, clickPI);

        return(remoteView);
    }

    class ImageLoaderTask extends AsyncTask<URL, Integer, Long>
    {
        private int position;

        ImageLoaderTask(int position)
        {
            this.position = position;
        }

        @Override
        protected void onPreExecute()
        {
            // Get foreground and background image
            Bitmap bitmapImage = BitmapFactory.decodeFile(m_AlarmItemNameArrayList.get(position)).copy(Bitmap.Config.ARGB_8888, true);
            canvasBackground = BitmapFactory.decodeResource(ctxt.getResources(), m_ThemeManagerObject.getWidgetListItemBgImage(m_ItemIndexArray.get(position), bitmapImage)).copy(Bitmap.Config.ARGB_8888, true);

            // Scaled foreground image and combine with the background image
            bitmapImage = Bitmap.createScaledBitmap(bitmapImage, 380, bitmapImage.getHeight() / 2, true);               
            Canvas comboImage = new Canvas(canvasBackground);
            comboImage.drawBitmap(bitmapImage, 0f, 0f, null);
        }

        @Override
        protected Long doInBackground(URL... urls)
        {
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... progress)
        {

        }

        @Override
        protected void onPostExecute(Long result)
        {

        }
    }

    @Override
    public void onCreate(){ 
    }

    @Override
    public void onDestroy(){
    }

    @Override
    public RemoteViews getLoadingView()
    {
        return(null);
    }

    @Override
    public int getViewTypeCount(){
        return(1);
    }

    @Override
    public long getItemId(int position){
        return(position);
    }

    @Override
    public boolean hasStableIds(){
        return(true);
    }

    @Override
    public void onDataSetChanged(){
    }
}

解决方案

WidgetProvider.class

public class WidgetProvider extends AppWidgetProvider 
{   
    private NoteManager         m_NoteManagerObject;

    private ThemeManager        m_ThemeManagerObject;

    private SimpleDateFormat    m_DateFormater;

    private static String       WIDGET_NEXT_BUTTON = "in.test.widgetApp.WIDGET_NEXT_BUTTON";

    private static String       WIDGET_PREV_BUTTON = "in.test.widgetApp.WIDGET_PREV_BUTTON";    

    public WidgetProvider()
    {
        // Create an singleton object of NoteManager class
        m_NoteManagerObject = NoteManager.getSingletonObject();
        // Create an singleton object of ThemeManager class
        m_ThemeManagerObject = ThemeManager.getSingletonObject();
        // Create an instance of SimpleDateFormat class
        m_DateFormater = new SimpleDateFormat("dd-MMM, EEE", Locale.US);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    {               
        super.onUpdate(context, appWidgetManager, appWidgetIds);

        // Set Date to current Date
        m_NoteManagerObject.setWidgetToCurrentDate();

        // Get the folder path of all-page-view
        ContextWrapper cw = new ContextWrapper(context.getApplicationContext());
        File customDirectoryPath = cw.getDir(Utilities.CUSTOM_DIRECTORY_NAME_PREFIX, Context.MODE_PRIVATE);
        File allPageDirectoryPath = new File(customDirectoryPath.getPath() + "/" + Utilities.All_PAGE_DIRECTORY_NAME_PREFIX); 

        if (!(allPageDirectoryPath.exists()))
            allPageDirectoryPath.mkdirs();

        m_ThemeManagerObject.readTheme(allPageDirectoryPath.getPath());     

        // Set up the intent that starts the WidgetService, which will
        // provide the views for this collection.   
        // When intents are compared, the extras are ignored, so we need to embed the extras
        // into the data so that the extras will not be ignored.
        Intent intent  = new Intent(context, WidgetService.class);
        intent.setData(Uri.fromParts("content", String.valueOf(appWidgetIds), null));

        // Instantiate the RemoteViews object for the App Widget layout.
        // Set up the RemoteViews object to use a RemoteViews adapter. 
        // This adapter connects to a RemoteViewsService  through the specified intent.
        // This is how you populate the data.
        RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_list);           
        remoteView.setRemoteAdapter(R.id.widget_list, intent);  

        // Show day, month and week day inside the widget
        remoteView.setTextViewText(R.id.txt_date, m_DateFormater.format(m_NoteManagerObject.getWidgetDate().getTime()));

        // The empty view is displayed when the collection has no items.        
        remoteView.setEmptyView(R.id.widget_list, R.id.widget_empty_text);              

        // On click of next button
        // This section makes it possible for items to have individualized behavior.
        // Set the action for the intent.
        // When the user touches a particular view, it will have the effect of
        // broadcasting ACTION.
        Intent nextButtonIntent = new Intent(context, WidgetProvider.class);            
        nextButtonIntent.setAction(WIDGET_NEXT_BUTTON);
        PendingIntent nextButtonPendingIntent = PendingIntent.getBroadcast(context, 0, nextButtonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.btn_next_month, nextButtonPendingIntent);
        remoteView.setInt(R.id.btn_next_month, "setBackgroundResource", m_ThemeManagerObject.getNextButtonBgImage());

        // On click of previous button
        // This section makes it possible for items to have individualized behavior.
        // Set the action for the intent.
        // When the user touches a particular view, it will have the effect of
        // broadcasting ACTION.
        Intent prevButtonIntent = new Intent(context, WidgetProvider.class);
        prevButtonIntent.setAction(WIDGET_PREV_BUTTON);
        PendingIntent prevButtonPendingIntent = PendingIntent.getBroadcast(context, 0, prevButtonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.btn_prev_month, prevButtonPendingIntent);
        remoteView.setInt(R.id.btn_prev_month, "setBackgroundResource", m_ThemeManagerObject.getPrevButtonBgImage());

        // Open application on click of app widget
        Intent clickIntent = new Intent(context, AllPageViewActivity.class);
        PendingIntent clickPI = PendingIntent.getActivity(context, 0,clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        remoteView.setOnClickPendingIntent(R.id.widget_empty_text, clickPI);
        remoteView.setOnClickPendingIntent(R.id.txt_date, clickPI); 

        appWidgetManager.updateAppWidget(appWidgetIds, remoteView); 
    }   

    @Override
    public void onReceive(Context context, Intent intent) 
    {           
        super.onReceive(context, intent);

        int numOfDays = 1;

        ComponentName thisWidget = new ComponentName(context, WidgetProvider.class);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

        if (intent.getAction().equals(WIDGET_NEXT_BUTTON)) 
        {
            // Increase no of days by one
            m_NoteManagerObject.setWidgetDate(numOfDays);

            // Update remote view
            RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_list);               
            remoteView.setTextViewText(R.id.txt_date, m_DateFormater.format(m_NoteManagerObject.getWidgetDate().getTime()));
            appWidgetManager.updateAppWidget(appWidgetIds, remoteView); 

            // Update list content of the widget
           // This will call onDataSetChanged() method of WidgetDisplay class
            appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_list);
        }   
        else if (intent.getAction().equals(WIDGET_PREV_BUTTON)) 
        {
            // Decrease no of days by one
            m_NoteManagerObject.setWidgetDate(-numOfDays);  

            // Update remote view
            RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_list);               
            remoteView.setTextViewText(R.id.txt_date, m_DateFormater.format(m_NoteManagerObject.getWidgetDate().getTime()));
            appWidgetManager.updateAppWidget(appWidgetIds, remoteView); 

            // Update list content of the widget
              // This will call onDataSetChanged() method of WidgetDisplay class
            appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_list);
        }                   
    }
}

这篇关于一个应用程序窗口小部件使用收集的更新问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆