2009-12-29 5 views
2

위젯은 업데이트 브로드 캐스트를 수신 할 때마다 아이콘을 변경하기위한 것입니다. 그러나 위젯은 아이콘을 제대로 표시하지 못하며 "문제로드 위젯"이라는 텍스트를 표시합니다. 로그 캣 메시지는 다음과 같습니다위젯의 아이콘을 onUpdate에서 변경하기

WARN/AppWidgetHostView(612): updateAppWidget couldn't find any view, using error view 
WARN/AppWidgetHostView(612): android.widget.RemoteViews$ActionException: can't find view: 0x7f060003 

내의 onUpdate의 코드는 다음과 같습니다

public class ImageWidgetProvider extends AppWidgetProvider{ 
private static final String TAG = "Steve"; 

public static final int[] IMAGES = { R.drawable.ic_launcher_alarmclock, 
    /*and many more*/}; 

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

    for (int appWidgetId : appWidgetIds) { 
     Log.d(TAG, "onUpdate:"); 
     int imageNum = (new java.util.Random().nextInt(IMAGES.length)); 
     Log.d(TAG, Integer.toString(IMAGES[imageNum])); 
     RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget); 
     remoteView.setImageViewResource(R.id.image_in_widget, IMAGES[imageNum]); 
     appWidgetManager.updateAppWidget(appWidgetId, remoteView); 
    } 

} 
} 

지금은 "R.id.image_in_widget"위에 마우스를 가져 가면 그것의 값이 0x7f060003 같다는 것을납니다 - Logcat에 따라 찾을 수없는보기. 두 번째 Log 문을 사용하여 IMAGES [imageNum]이 실제로 IMAGES 배열의 임의 이미지를 참조하는지 확인했습니다. (중요한 경우, 16 진수가 아닌 10 진수 값으로 나타납니다.) 내가 잘못하고있는 아이디어가 있습니까? 고마워요!

-

편집 : 여기에 image_in_widget의 이미지 뷰가 선언 된 위젯의 레이아웃 파일입니다.

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

<ImageView android:name="@+id/image_in_widget" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 
</LinearLayout> 
+0

정말 이상합니다. 당신이 모든 일을 올바르게하고있는 것 같습니다. 레이아웃 파일에서 허용 된 UI 구성 요소를 사용하면 작동합니다. 이 "문제 로딩 위젯"은 위젯을 화면에 놓은 직후에 표시됩니다. 나는 이유가 무엇인지 모른다. .. 미안하다. 아마 1.6 에뮬레이터에서 위젯을 실행하려고합니까? – Ramps

+0

예, "문제로드 위젯"이 즉시 표시됩니다. v1.6 에뮬레이터와 동일합니다. 시도해 줘서 고마워요 -이게 이상하다고 생각하는 사람이 아니란 걸 알게되어 기쁩니다. –

답변

2
+0

1 년 6 개월 전에이 질문을 받았으므로 답을 테스트 할 방법이 없습니다 : P 그러나이 질문을 한 후 제 경험으로 기사에서 언급 한 것과 동일한 것을 발견했습니다. "Project"-> "Clean"으로 가야합니다. 특히 리소스를 찾을 수없는 오류가 발생하는 경우가 있습니다. –

+0

링크를 요약하려면 프로젝트를 정리하십시오. 그러나 이것은 내 문제를 해결하지 못했습니다. 제 경우 Kris Giesing의 대답은 무슨 일이 일어 났는지 설명했습니다. – trooper

0

아마도 귀하의 예에서는 적용되지 않지만 응용 프로그램 위젯과 비슷한 문제가있을 수 있습니다. 안드로이드 1.5에서는 홈 화면 위젯과 관련된 성가신 문제가있었습니다. 특별한 경우 응용 프로그램 위젯은 여전히 ​​메모리에서 활성화되었지만 더 이상 볼 수 없습니다.
appWidgetIds를 통해 열거하는 경우이 배열에 예상되는 ID 수가 정확하게 포함되어 있는지 확인하십시오. 다른 Log.d()를 사용하여 ID를 기록하십시오. 어쩌면 당신은 또한 어떤 "유령"위젯을 가지고있을 것입니다.
어떤 안드로이드 버전을 사용 하시나요?

+0

흥미 롭습니다 ... 저는 Android v1.5를 위해 실제로 프로그래밍하고 있습니다. Logcat에서 내가 보았던 이상한 것들을 이해할 수있다. 내가 삭제 한 다른 위젯의 라인을 디버깅한다. 방금 ​​더 많은 디버깅 라인을 추가하려고 시도했지만 홈 화면에 위젯이 많지 않지만 37 개부터 계산되기 시작합니다.하지만 배열에는 올바르게 1 개의 항목 만 있습니다. 이것이 우리에게 무엇을 말해 줍니까?나에게 문제의 원인이 아니라는 것을 의미하는 것처럼 보이지만, 당신이 생각하는 것을 알려주십시오. –

+0

사실, 귀하의 경우에는 문제의 원인이 아닙니다. 하지만 코드가 괜찮은 것 같습니다. 1. appwidget-provider 파일에서 android : updatePeriodMillis를 사용하여 수동으로 위젯을 업데이트하는 방법은 무엇입니까? 2. 위젯의 레이아웃 파일에 image_in_widget id를 가진 ImageView가 있다고 가정합니다. 3. appwidget-provider에서 초기 레이아웃을 설정합니까? – Ramps

+0

1. 인 텐트를 브로드 캐스팅하는 구성 활동을 통해 업데이트하려고 시도했습니다.보다 간단하게 xml 파일에서 android : updatePeriodMillis 행을 사용했습니다. 2. 실제로 그렇습니다. ID는 R.java 파일에 값이 주어 지므로 알 수있는 한 제대로 인식됩니다. 3. 아니요, 다른 곳에서는 초기 레이아웃을 설정하지 않았습니다. 무슨 일이 일어나는지 보려고 그렇게 해보겠습니다. –

1

Android 1.5에는 위젯 용 OnDelete가 호출되지 않는 문제가 있습니다.

당신의 AppWidgetProvider에이 코드를 넣어이 문제

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); 
    } 
} 
+0

감사합니다. 그 전에 버그를 보았지만 그것이 관련이 없다고 가정 했었습니다. 그러나이 프로그래밍 여행에서 제 직감이 여러 번 틀린 것으로 나타났습니다. 일단이 프로젝트로 돌아 오면, 한번 해봅시다. –

2

이 (원래 포스터보다있는 moreso,이 문제에 대한 웹 검색 사람들을 위해) 일어날 수있는 또 다른 이유 해결해야

하는 경우를 가로와 세로를 구분하는 레이아웃이 있으므로 두 레이아웃 모두 업데이트 중에 참조하는 뷰를 모두 포함해야합니다. 한 모드로만 표시되는보기 (예 : 세로)를 참조하는 경우 가로 방향으로 위젯 상자에 "위젯로드 문제"메시지가 표시됩니다.

간단한 해결책은보기를 표시하지 않으려는 모드에서 표시 여부를 '해제'로 설정하는 것입니다.

+0

Bam, 알아 낸 시간이 걸릴 수있는 뭔가를 해결했습니다. 팁 고마워. –

+0

방금 ​​api 10을 사용하여이 테스트를 실시했는데 이와 같은 것이 원인이었습니다. 모든 레이아웃에 표시되지 않는 뷰의 속성을 설정했습니다. 최신 API 버전에서는 이것이 더 이상 문제가되지 않는 것 같습니다 (이러한 호출은 무시됩니다). – trooper