Frage zu Android Widget

E

EmmZett

Neues Mitglied
0
Hallo zusammen,

ich habe ein kleines, einfaches Widget programmiert mit dem ich Vokabeln lernen möchte.
Die Idee dahinter:
Ich sammel Vokabeln in einer txt Datei, diese wird vom Widget eingelesen und dann werden nacheinander die einzelnen Textzeilen angezeigt.
Ich habe das Widget nach diesem Tutorial programmiert.

Hier mein Code:
Code:
package de.mz.vocabwidgeten;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Environment;
import android.widget.RemoteViews;

public class MyWidgetProvider extends AppWidgetProvider {
    
    //private static final String ACTION_CLICK = "ACTION_CLICK";

    @Override
      public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds)
    {
        // Get all ids
        ComponentName thisWidget = new ComponentName(context,MyWidgetProvider.class);
        int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
        
        // read & get text file
        File sdcard = Environment.getExternalStorageDirectory();
        File file = new File(sdcard,"VocabularyEN.txt");
        List<String> list = new ArrayList<String>();
        
        try 
        {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;
            while ((line = br.readLine()) != null) 
            {
                list.add(line);
            }
            br.close();
        }
        catch (IOException e) {
            //You'll need to add proper error handling here
        }
        
        String[] items = new String
[list.size()];
        items = list.toArray(items);
        
        for (int widgetId : allWidgetIds)
        {
            int number = (new Random().nextInt(items.length));
            
            //modify string to show
            String[] separated = items[number].split("&&");
                            
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_layout);
            //Log.w("WidgetExample", separated[0] + "\n -- \n" + separated[1]);
            // Set the text
            remoteViews.setTextViewText(R.id.update, separated[0] + "\n -- \n" + separated[1]);
        
            // Register an onClickListener
            Intent intent = new Intent(context, MyWidgetProvider.class);
            intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
        
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
            appWidgetManager.updateAppWidget(widgetId, remoteViews);
                        
        }
    }
}
Soweit klappt auch alles.
Ich würde nur gerne ncoh zwei Dinge ändern und hoffe dabei auf eure Hilfe.

1) Bisher habe ich es nur geschafft die einzelnen Zeilen der Textdatei auf Zufallsbasis anzuzeigen. Ich würde aber gerne, dass das Widget die Zeilen von der ersten bis zur letzten anzeigt und dann von vorne beginnt. Wie kann ich das umsetzen?

2) Ich denke es ist ziemlich uneffektiv dass die txt datei bei jedem Widgetupdate neu eingelesen wird. Besteht die Möglichkeit, dass die Datei eingelesen wird wenn das Widget auf dem Homescreen platziert wird und dann nur noch die einzelnen Zeilen angezeigt werden?

Schonmal danke für Ratschläge
 
zu 1)
statt
int number = (new Random().nextInt(items.length));
halt die nummer nehmen die aktuell dran ist, musst du dir halt irgendwo merken welche Zeile als letztes dran war.

zu 2)
Richtig, allerdings hab ich mich bisher noch nicht mit Widgets beschäftigt, guck doch mal was es noch für methoden ausser "onUpdate" gibt.

Oder aber du packst dir deine Daten in eine Datenbank, dazu sollte es auch genügend Tutorials im Internet zu finden geben :)
 
amfa schrieb:
zu 1)
statt
int number = (new Random().nextInt(items.length));
halt die nummer nehmen die aktuell dran ist, musst du dir halt irgendwo merken welche Zeile als letztes dran war.

Das ist logisch. Fuer mich als Anfaenger stellt sich nur die Frage wie ich das machen soll. Wenn bei jedem Update alles neu ausgefuehrt wird wird auch jede Zaehlvariable immer neu initialisiert. Daher ist mir nicht klar wie ich das umsetzen soll. Vorschlaege?
 
entweder speicherst du du das ganze in einer statischen variable oder als Klassen variable.
Wobei ich gerade nicht weiß ob die OnUpdate Methode immer auf dem gleichen Objekt aufgerufen wird.
Du könntest die aktuelle Zahl auch in den Preferences speichern oder in einer eigenen Textdatei und diese jedesmal auslesen.
 

Ähnliche Themen

wernho
Antworten
11
Aufrufe
686
wernho
wernho
A
Antworten
1
Aufrufe
583
swa00
swa00
B
Antworten
4
Aufrufe
489
bb321
B
Zurück
Oben Unten