2012-01-23 3 views
0

AppWidgetProvider 클래스의 onUpdate() 섹션에서 시작된 서비스로 업데이트되는 App 위젯에서 작업하고 있습니다. 문제는 위젯 서비스 내에서 커서를 사용할 때마다 뷰가 위젯에 추가되지 않는다는 것입니다. SQL 쿼리/결과를 단순히 문자열로 바꾸면 작동합니다. 는 SQL 결과를 반환하고, 뷰가 추가 되더라도,SQlite 쿼리를 사용하는 Android 앱 위젯

public class TestWidgetService extends Service { 

    @Override 
    public void onStart(Intent intent, int startId) { 

     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 

     ComponentName thisWidget = new ComponentName(getApplicationContext(), TestWidget.class); 

     int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 

     for (int widgetId : allWidgetIds) { 

      RemoteViews remoteViews = new RemoteViews(
        getApplicationContext().getPackageName(), 
        R.layout.test_widget 
        ); 

      // get items 

      Uri items = Uri.parse(TestWidgetContent.CONTENT_URI + "/news/1"); 
      Cursor iCursor = getContentResolver().query(items, null, null, null, "ITM_TIMESTAMP DESC"); 
      if (iCursor == null) { 
       continue; 
      } 
      else if (iCursor.moveToFirst()) { 
       while (iCursor.isAfterLast() == false) { 

        Log.w("got", iCursor.getString(iCursor.getColumnIndex("FED_TITLE"))); 

        RemoteViews item = new RemoteViews(
          getApplicationContext().getPackageName(), 
          R.layout.test_widget_item 
        ); 

        item.setTextViewText(
          R.id.test_widget_item_feed, 
          iCursor.getString(iCursor.getColumnIndex("FED_TITLE")) 
         ); 

        item.setTextViewText(
          R.id.test_widget_item_title, 
          iCursor.getString(iCursor.getColumnIndex("ITM_TITLE")) 
         ); 

        remoteViews.addView(R.id.test_widget_items, item); 

        iCursor.moveToNext(); 
       } 
      } 
      iCursor.close(); 


      // 

      appWidgetManager.updateAppWidget(widgetId, remoteViews); 
     } 

     stopSelf(); 
     super.onStart(intent, startId); 
    } 

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

이 예제는 추가 의견없이 레이아웃 "test_widget"을 보여줍니다

예 (컨텐트 프로/SQL 사용)가 작동하지 않습니다.

작동 예 (문자열 만 해당) :

public class TestWidgetService extends Service { 

    @Override 
    public void onStart(Intent intent, int startId) { 

     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 

     ComponentName thisWidget = new ComponentName(getApplicationContext(), TestWidget.class); 

     int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 

     for (int widgetId : allWidgetIds) { 

      RemoteViews remoteViews = new RemoteViews(
        getApplicationContext().getPackageName(), 
        R.layout.test_widget 
        ); 

      // get items 

        RemoteViews item = new RemoteViews(
          getApplicationContext().getPackageName(), 
          R.layout.test_widget_item 
        ); 

        item.setTextViewText(
          R.id.test_widget_item_feed, 
          "feed" 
         ); 

        item.setTextViewText(
          R.id.test_widget_item_title, 
          "title" 
         ); 

        remoteViews.addView(R.id.test_widget_items, item); 

      // 

      appWidgetManager.updateAppWidget(widgetId, remoteViews); 
     } 

     stopSelf(); 
     super.onStart(intent, startId); 
    } 

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

이 작업 예제는 내가하려고 지난 주 썼다

있는 LinearLayout ID가 "test_widget_items"내 삽입 된 전망 레이아웃 "test_widget"를 보여줍니다 SQL 결과를 사용하려면이 위젯을 얻으십시오.

+0

난 그냥 대신 전체 DB를 인스턴스화의) TestWidgetService.this.openOrCreateDatabase을 (시도했습니다 도우미 클래스지만, 같은 문제가있어, 추가 된보기가 결과가 올바르게 읽혀 지더라도 (그리고 LogCat에 표시 되더라도) 위젯에는 표시되지 않습니다. – Andre

답변

0

가 에뮬레이터에 문제가 있었다 밝혀졌습니다의 AVD 스냅 샷을 제거하고 다시 응용 프로그램을 시작한 후, 위젯은 괜찮다고