2016-10-08 1 views
0

Ich habe versucht, meine App durch Tippen auf das Widget für Wochen zu öffnen, aber nichts scheint zu funktionieren. Ich denke, dass etwas an meinem Code meine Situation von etwas unterscheidet. Mein Widget ist nur eine Liste mit Aufgaben. Ich werde nur ganze Klassen veröffentlichen, damit die Leute sehen können, was vor sich geht.Tippen Sie auf Widget, um App zu öffnen

Könnte jemand bitte mir dabei helfen?

ListProvider:

public class ListProvider implements RemoteViewsService.RemoteViewsFactory { 
    private ArrayList<ListObject> listObjectList = new ArrayList<ListObject>(); 
    private Context context = null; 
    private TinyDB tinyDB; 

    private ArrayList<Integer> checkedPositions = new ArrayList<>(); 

    public ListProvider(Context context, Intent intent) { 
     this.context = context; 

     populateWidget(); 
    } 

    private void populateWidget() { 
     if(MainActivity.user != null) { 

      checkedPositions.clear(); 

      for(int i = 0; i < MainActivity.user.getTaskLists().size(); i++){ 
       TaskList taskList = MainActivity.user.getTaskLists().get(i); 

       listObjectList.add(new ListTitle(taskList.getName())); 

       for (int j = 0; j < taskList.getTasks().size(); j++) { 
        ListItem listItem = new ListItem(); 
        listItem.text = taskList.getTasks().get(j).getTitle(); 
        listObjectList.add(listItem); 

        if(taskList.getTasks().get(j).isChecked()){ 
         //if task is checked, add to checked list 
         checkedPositions.add(listObjectList.size() - 1); 
        } 
       } 

       listObjectList.add(new ListItem(" ")); 
      } 
     }else{ 
      loadLastSavedList(); 
     } 
    } 

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

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

    /* 
    *Similar to getView of Adapter where instead of View 
    *we return RemoteViews 
    * 
    */ 
    @Override 
    public RemoteViews getViewAt(int position) { 
     RemoteViews remoteView = new RemoteViews(
       context.getPackageName(), R.layout.widget_list_item); 

     ListObject listObject = listObjectList.get(position); 

     //get whether item is a item or title 
     if(listObject.getClass().equals(ListItem.class)) { 
      //list item 
      ListItem listItem = (ListItem) listObject; 
      remoteView.setTextViewText(R.id.title, ""); 
      remoteView.setTextViewText(R.id.text, listItem.text); 
     }else{ 
      //list title 
      ListTitle listTitle = (ListTitle) listObject; 
      remoteView.setTextViewText(R.id.text, ""); 
      remoteView.setTextViewText(R.id.title, listTitle.title); 
     } 

     //text size 
     SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); 

     String textSize = SP.getString(context.getString(R.string.widget_pref_key_text_size), context.getString(R.string.medium)); 
     System.out.println(textSize); 
     if (textSize.equals(context.getString(R.string.small))) { 
      //small 
      remoteView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_SP, 14); 
      remoteView.setTextViewTextSize(R.id.title, TypedValue.COMPLEX_UNIT_SP, 16); 
     } else if (textSize.equals(context.getString(R.string.large))) { 
      //large 
      remoteView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_SP, 22); 
      remoteView.setTextViewTextSize(R.id.title, TypedValue.COMPLEX_UNIT_SP, 24); 
     } else { 
      //medium, default 
      remoteView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_SP, 18); 
      remoteView.setTextViewTextSize(R.id.title, TypedValue.COMPLEX_UNIT_SP, 20); 
     } 

     //strikethrough if checked 
     if(checkedPositions.contains(position)){ 
      remoteView.setInt(R.id.text, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); 
     }else{ 
      remoteView.setInt(R.id.text, "setPaintFlags", (~ Paint.STRIKE_THRU_TEXT_FLAG) & Paint.ANTI_ALIAS_FLAG); 
     } 


     return remoteView; 
    } 


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

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

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

    @Override 
    public void onCreate() { 
     loadLastSavedList(); 
    } 

    private void loadLastSavedList() { 
     //load up saved items 
     tinyDB = new TinyDB(context); 
     ArrayList<String> strings = tinyDB.getListString(context.getString(R.string.saved_key)); 
     System.out.println(strings.size()); 

     //full up listItems 
     for(int i = 0; i < strings.size(); i++) { 
      if(i == 0){ 
       //first object, title 
       listObjectList.add(new ListTitle(strings.get(i))); 
      }else if(strings.get(i - 1).equals(" ")){ 
       //title 
       listObjectList.add(new ListTitle(strings.get(i))); 
      }else{ 
       //list item 
       listObjectList.add(new ListItem(strings.get(i))); 
      } 
     } 
    } 

    @Override 
    public void onDataSetChanged() { 
     listObjectList.clear(); 
     populateWidget(); 

     //save list items 
     ArrayList<String> strings = new ArrayList<>(); 
     for(ListObject listObject: listObjectList){ 
      if(listObject.getClass().equals(ListItem.class)) { 
       //list item 
       ListItem listItem = (ListItem) listObject; 
       strings.add(listItem.text); 
      }else{ 
       //list title 
       ListTitle listTitle = (ListTitle) listObject; 
       strings.add(listTitle.title); 
      } 
     } 

     tinyDB = new TinyDB(context); 
     tinyDB.putListString(context.getString(R.string.saved_key), strings); 
    } 

    @Override 
    public void onDestroy() { 

    } 

} 

WidgetProvider:

public class WidgetProvider extends AppWidgetProvider { 

    /** 
    * this method is called every 30 mins as specified on widgetinfo.xml 
    * this method is also called on every phone reboot 
    **/ 
    @Override 
    public void onUpdate(Context context, AppWidgetManager 
      appWidgetManager, int[] appWidgetIds) { 

/*int[] appWidgetIds holds ids of multiple instance 
* of your widget 
* meaning you are placing more than one widgets on 
* your homescreen*/ 
     final int N = appWidgetIds.length; 
     for (int i = 0; i < N; i++) { 
      RemoteViews remoteViews = updateWidgetListView(context, 
        appWidgetIds[i]); 

      appWidgetManager.updateAppWidget(appWidgetIds[i], 
        remoteViews); 
     } 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 
    } 

    private RemoteViews updateWidgetListView(Context context, 
              int appWidgetId) { 

     //which layout to show on widget 
     RemoteViews remoteViews = new RemoteViews(
       context.getPackageName(), R.layout.widget_layout); 

     //RemoteViews Service needed to provide adapter for ListView 
     Intent svcIntent = new Intent(context, WidgetService.class); 
     //passing app widget id to that RemoteViews Service 
     svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     //setting a unique Uri to the intent 
     //don't know its purpose to me right now 
     svcIntent.setData(Uri.parse(
       svcIntent.toUri(Intent.URI_INTENT_SCHEME))); 
     //setting adapter to listview of the widget 
     remoteViews.setRemoteAdapter(appWidgetId, R.id.listViewWidget, 
       svcIntent); 
     //setting an empty view in case of no data 
     remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view); 

     return remoteViews; 
    } 
} 

Vielen Dank im Voraus!

Antwort

1

Sie haben keinen Code, der Android mitteilt, dass Sie etwas tun, wenn der Benutzer auf ein Listenelement klickt.

In getViewAt(), benötigen Sie einen Intent zu erstellen, füllen Sie es mit Extras (zum Beispiel die Daten mit dieser Liste Reihe zugeordnet zu identifizieren), und rufen Sie setOnClickFillInIntent() auf dem RemoteViews, die auf dem Click-Ereignis reagieren soll.

Dann in onUpdate() Ihrer AppWidgetProvider, müssen Sie setPendingIntentTemplate() auf der RemoteViews nennen, die Ihre ListView hält (oder StackView oder was auch immer Sie verwenden), wo diese PendingIntent hüllt ein Intent ausgefüllt werden und aufgerufen, wenn der Benutzer Taps auf einem Artikel in diesem ListView.

This sample app demonstriert dies, indem Sie ein App-Widget erstellen, das eine Liste von 25 lateinischen Wörtern anzeigt und auf Klicks auf jede davon reagiert.

+0

Dies funktioniert, aber ich möchte es so, wenn Sie irgendwo auf das Widget drücken, wird es geöffnet. Dies macht es so, dass Sie auf einen Listenpunkt drücken müssen. – Jared

+0

@Jared: AFAIK, wenn Sie eine "ListView" in einem App-Widget präsentieren, wird der Benutzer erwarten, dass durch Tippen auf ein Listenelement etwas spezifisch für dieses Listenelement angezeigt wird. In Ihrem Fall würde es eine Aktivität mit Details der Aufgabe anzeigen, auf die der Benutzer geklickt hat. Denn so funktionieren Scroll-Listen überall sonst in Android: Klicken Sie auf einen Gegenstand und es passiert etwas, das für den jeweiligen Gegenstand relevant ist. Nachdem dies gesagt wurde, können Sie versuchen, 'setOnClickPendingIntent()' auf den 'RemoteViews' aufzurufen und die ID der' ListView' zu übergeben. – CommonsWare

Verwandte Themen