10

Ich habe eine App für Android, die ich bereits ein appwidget dafür vor Lollipop gemacht, aus bestimmten Gründen erscheint das Widget nicht in Lollipop. Es zeigt sich jedoch in den Pre-Lollipop-Geräten.appWidget nicht in Launcher-Widget-Liste nur in Lollipop-Geräten

Hier ist mein Code:

AndroidManifest.xml

<receiver android:name=".widgets.NewsWidgetProvider" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" >> 
     <intent-filter > 
      <action 
       android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.appwidget.provider" 
      android:resource="@xml/news_info" /> 
</receiver> 

news_info.xml

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:initialLayout="@layout/widget_news" 
android:minHeight="72dp" 
android:minWidth="300dp" 
android:updatePeriodMillis="6000000" > 

NewsWidgetProvider.java

public class NewsWidgetProvider extends AppWidgetProvider { 
private static final String NEXT_NEWS = "NEXT_NEWS"; 
private static final String PREVIOUS_NEWS = "PREVIOUS_NEWS"; 
private static final String GO_TO_NEWS_ACTIVITY = "GO_TO_NEWS_ACTIVITY"; 
private final String NEWS_LIST_KEY = "newsList"; 
NewsItem[] news; 
int currentNews=0; 
Bitmap imageBitmap; 
private final String CURRENT_NEWS_KEY = "currentNews"; 

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

    startService(context); 

    loadItemFromSharedPreference(context); 

    for (int widgetId : appWidgetIds) { 
     setUpView(context, appWidgetManager, appWidgetIds, widgetId); 
    } 

} 


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

    if (news != null) { 
     if (GO_TO_NEWS_ACTIVITY.equals(intent.getAction())){ 
     openNewsActivity(context); 
    } 

     else if (NEXT_NEWS.equals(intent.getAction())) { 
      if (currentNews == news.length - 1) { 
       Toast.makeText(context, "reached last news", Toast.LENGTH_SHORT).show(); 
      } 
     else if (news.length - 1 > currentNews) { 
      currentNews++; 
      SharedPreferencesManager.putInteger(context, CURRENT_NEWS_KEY, currentNews); 
      loadItemFromSharedPreference(context); 
      setTheCurrentView(context); 
     } 
     } 
    else if (PREVIOUS_NEWS.equals(intent.getAction())) { 
       if (currentNews == 0) { 
        Toast.makeText(context, context.getString(R.string.last_item), Toast.LENGTH_SHORT).show(); 
       } 
       else if (currentNews > 0 && news != null) { 
        currentNews--; 
        SharedPreferencesManager.putInteger(context, CURRENT_NEWS_KEY, currentNews); 
        loadItemFromSharedPreference(context); 
        setTheCurrentView(context); 
       } 
      } 

    } 
} 

private void setUpView(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, int widgetId) { 
    final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
      R.layout.widget_news); 

    remoteViews.setTextViewText(R.id.title, news==null?context.getString(R.string.wait_msg):news[currentNews].title); 

    remoteViews.setTextViewText(R.id.brief,news==null?"":news[currentNews].brief); 
    setPendingIntents(context, appWidgetIds, remoteViews); 
    if (news!=null) { 
     if (imageBitmap!=null) { 
      AQuery aq = new AQuery(context); 
      remoteViews.setImageViewBitmap(R.id.image, aq.getCachedImage(news[currentNews].imageUrl, 100)); 
     } 
     else { 
      remoteViews.setImageViewResource(R.id.image,R.drawable.ic_launcher); 
     } 
    } 
    else { 
     remoteViews.setImageViewResource(R.id.image,R.drawable.ic_launcher); 
    } 
    appWidgetManager.updateAppWidget(widgetId, remoteViews); 
} 


private void setTheCurrentView(Context context) { 
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
      R.layout.widget_news); 
    remoteViews.setTextViewText(R.id.title, news==null?context.getString(R.string.widget_problem_title):news[currentNews].title); 
    remoteViews.setTextViewText(R.id.brief,news==null?context.getString(R.string.widget_problem_breif):news[currentNews].brief); 
    remoteViews.setImageViewBitmap(R.id.image, imageBitmap); 
    ComponentName thisWidget = new ComponentName(context, NewsWidgetProvider.class); 
    AppWidgetManager.getInstance(context).updateAppWidget(thisWidget, remoteViews); 
} 

private void openNewsActivity(Context context) { 
    Intent o=new Intent(context, NewsActivity.class); 
    o.putExtra(NewsItem.EXTRA_NEWS_ITEM,news[currentNews]); 
    o.putExtra(NewsItem.EXTRA_NEWS_SOURCE_IS_PUSH_OR_WIDGET,true); 
    o.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(o); 
} 

private void setPendingIntents(Context context, int[] appWidgetIds, RemoteViews remoteViews) { 
    remoteViews.setOnClickPendingIntent(R.id.next_news, getPendingSelfIntent(context, NEXT_NEWS, appWidgetIds)); 
    remoteViews.setOnClickPendingIntent(R.id.previous_news,getPendingSelfIntent(context,PREVIOUS_NEWS,appWidgetIds)); 
    remoteViews.setOnClickPendingIntent(R.id.title,getPendingSelfIntent(context,GO_TO_NEWS_ACTIVITY,appWidgetIds)); 
    remoteViews.setOnClickPendingIntent(R.id.brief,getPendingSelfIntent(context,GO_TO_NEWS_ACTIVITY,appWidgetIds)); 
    remoteViews.setOnClickPendingIntent(R.id.image,getPendingSelfIntent(context,GO_TO_NEWS_ACTIVITY,appWidgetIds)); 
} 

protected PendingIntent getPendingSelfIntent(Context context, String action,int[] appWidgetIds) { 
    Intent intent = new Intent(context, getClass()); 
    intent.setAction(action); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
      0, intent, 0); 
    return pendingIntent; 
} 
private void loadItemFromSharedPreference(Context context) { 

    currentNews=SharedPreferencesManager.getInteger(context, CURRENT_NEWS_KEY, 0); 
    news=SharedPreferencesManager.getObject(context, NEWS_LIST_KEY,NewsItem[].class); 
    AQuery aq = new AQuery(context); 
    imageBitmap= news == null ? BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher) : aq.getCachedImage(news[currentNews].imageUrl,200); 
} 

private void startService(Context context) { 
    Intent broadcastIntent = new Intent(context, NewsWidgetService.class); 
    //only start service if news is null 
    if (SharedPreferencesManager.getObject(context, NEWS_LIST_KEY, NewsItem[].class)==null) 
     context.startService(broadcastIntent); 
} 

}

Der Code arbeitet in (kitkat, Gelee ...), aber es funktioniert nicht in Lutscher

Bin ich etwas fehlt?

+0

Ich habe den gleichen Fehler auf Genymotion 4.3 Verwendung von Google Now Launcher, die die Standard-Launcher in Lollipop ist, so dass das Problem innerhalb der Abschuß liegt und nicht Lollipop –

+0

per se sehe ich die gleiche Problem mit Whatsapp und der Facebook-App, aber seltsamerweise nicht mit Evernote –

+0

Was ist das Gerät, auf dem Sie Lollipop laufen und versuchen, Ihr Widget auf zu zeigen? – Libelle

Antwort

1

hatte ich das gleiche Problem - ich es durch das Hinzufügen zusätzlicher Parameter festgelegt android: widgetCategory = "home_screen" to-Anbieter appwidget:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="294dp" 
    android:minHeight="40dp" 
    android:updatePeriodMillis="86400000" 
    android:configure="com.example.activities.ConfigurationActivity" 
    android:previewImage="@drawable/ic_launcher" 
    android:initialLayout="@layout/widget_layout" 
    android:widgetCategory="home_screen" 
    android:resizeMode="none"> 
</appwidget-provider> 
+0

teste es jetzt –

+0

Hast du noch etwas geändert? Mein Code sieht dir sehr ähnlich, aber ich sehe kein App Widget auf Lollipop Geräten. – astryk

+0

hat immer noch das gleiche Problem –

0

Dies ist ein Fehler in Google Now Launcher. Ich habe festgestellt, dass eine Problemumgehung darin besteht, Ihrer App einen Dummy-ContentProvider hinzuzufügen. Sie können sehen, wie man das unter my answer to this other question macht.

0

Dieses Problem tritt bei der Installation von Widgets aus dem Play Store und sogar bei der direkten Installation von Android Studio während der Entwicklung auf.

Lösungen für mich gearbeitet:

  • das Gerät nach der ersten Anwendung Neustarten/appwidget für mich gearbeitet installieren.
  • Installieren eines benutzerdefinierten Launcher
Verwandte Themen