widgets programmieren

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von k3nscher, 08.09.2009.

  1. k3nscher, 08.09.2009 #1
    k3nscher

    k3nscher Threadstarter Erfahrener Benutzer

    Beiträge:
    245
    Erhaltene Danke:
    14
    Registriert seit:
    03.09.2009
    Hallo,
    bin gerade dabei mir ein Programm zu schreiben welches den Stundenplan von der Uni downlädt und auf meinem Handy anzeigt. Fehlt nurnoch ein widget dazu.. hat da jemand ein Tutorial oder so?

    Sollte ja nich schwer sein. Schätze muss im Manifest deklariert werden und dann kommt irgendwohin noch ne onupdate() funktion oder so...

    Danke euch für die Hilfe
     
  2. Shinigami, 08.09.2009 #2
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Hi.

    Schau mal hier im Android Dev. Blog.

    Die Seite (also nicht unbedingt der Blog) sollte bei sowas immer der erste Anlaufpunkt sein.

    Gruß,
    Shini
     
    k3nscher bedankt sich.
  3. k3nscher, 08.09.2009 #3
    k3nscher

    k3nscher Threadstarter Erfahrener Benutzer

    Beiträge:
    245
    Erhaltene Danke:
    14
    Registriert seit:
    03.09.2009
    Super!!! Wieder was gelernt. Klasse Seite..
     
  4. k3nscher, 10.09.2009 #4
    k3nscher

    k3nscher Threadstarter Erfahrener Benutzer

    Beiträge:
    245
    Erhaltene Danke:
    14
    Registriert seit:
    03.09.2009
    Es hilft nichts, ich brauch trotzdem eure hilfe... Ich bekomm das Widget nich zum laufen.. was ich schon habe:

    Das Hauptprogramm
    Code:
    public class hello extends Activity {
        /** Called when the activity is first created. */
        @SuppressWarnings("unchecked")
        @Override
            
        
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    //usw........
       
    Dann den Eintrag in die Manifest Datei
    Code:
    <receiver android:name="AppWidgetProvider" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
                   android:resource="@xml/widget" />
    </receiver>
    Dann die widget.xml Datei in /xml/
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android">
        android:minWidth="294dp" <!-- density-independent pixels -->
        android:minHeight="72dp"
        android:updatePeriodMillis="86400000" <!-- once per day -->
        android:initialLayout="@layout/appwidgetlayout"
        android:configure="com.example.android.ExampleAppWidgetConfigure" >
    </appwidget-provider>
    
    und die appwidgetlayout.xml Datei
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content">
    <TextView android:text="TextView01" android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
    </LinearLayout>
    mit der layoutdatei bin ich mir nich so ganz sicher ob das passt.... also zumindest wird das widget nicht unter widgets angezeigt wenn man das programm installiert.
    Wo und wie bring ich jetz die onupdate methode rein? Hab wirklich schon viel gegoogelt aber irgendwie hab ich irgendwo noch nen denkfehler Bzw der mekkert bei dem was ich mit dem onupdate probiert hab dass das an der stelle nich geht.
     
  5. Scogit, 10.09.2009 #5
    Scogit

    Scogit Android-Hilfe.de Mitglied

    Beiträge:
    69
    Erhaltene Danke:
    2
    Registriert seit:
    16.08.2009
    Phone:
    Samsung Galaxy
    Welche Fehlermeldung bekommst du denn beim debuggen?
     
  6. Shinigami, 11.09.2009 #6
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Guten Morgen.

    Ich glaube ein Hauptprogramm, das von Activity erbt braucht man für nen Widget nicht. Höchstens, wenn man noch nen Konfigscreen zur Verfügung stellt. Ansonsten gibt man eine Klasse an, die von AppWidgetProvider erbt und die zugehörige onUpdate() Methode überschreibt. Diese Klasse müsste man hier
    PHP:
    <receiver android:name="NameDeinerKlasse" >
    angeben.

    Ich schlage vor Du lädst Dir mal den kompletten Source von dem Widget-Beispiel aus dem Blog runter und modifizierst das Stück für Sück um Dich mit dem Gesamtkonstrukt vertraut zu machen. Falls Du den Link übersehen haben solltest: SimpleWiktionary Sample

    Grüße,
    Shini
     
  7. k3nscher, 11.09.2009 #7
    k3nscher

    k3nscher Threadstarter Erfahrener Benutzer

    Beiträge:
    245
    Erhaltene Danke:
    14
    Registriert seit:
    03.09.2009
    Also wahrscheinlich seh ich den Wald vor lauter Bäumen nicht...

    Ich hab ein Activity und ein Widget.... Das Activity hab ich ja schon definiert mit

    Code:
    public class hello extends Activity {
        /** Called when the activity is first created. */
        @SuppressWarnings("unchecked")
        @Override
            
        
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    //usw........
    Wo kommt jetzt der Code für das Widget?

    Da merkt man mal wie man das gespür für den Syntax verliert wenn man zu viel mit Visual Studio und so programmiert. Der macht das alles automatisch...

    Also etwas genauer die Frage: Wo kann ich die Widgetklasse überschreiben wenn das mein Quelltext ist:

    Code:
    package domi.android;
    
    
    
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    
    import org.apache.http.util.EntityUtils;
    
    import java.io.IOException;
    import java.net.URI;
    import java.util.ArrayList;
    import java.util.List;
    
    import android.R.string;
    import android.app.Activity;
    import android.app.PendingIntent;
    import android.app.Service;
    import android.appwidget.AppWidgetManager;
    import android.appwidget.AppWidgetProvider;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.res.Resources;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.widget.*;
    import android.text.format.Time;
    import android.view.*;
    import android.view.View.OnClickListener;
    
    public class hello extends Activity {
        /** Called when the activity is first created. */
        @SuppressWarnings("unchecked")
        @Override
            
        
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
    //hier ist der Quelltext fürs Activity 
        }
    
    };
     
    }
    
     
  8. Shinigami, 11.09.2009 #8
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Ich hab's wie folgt verstanden:

    Man benötigt eine Klasse, die die Update-Funktionalität bereitstellt - nennen wir sie z.B. WidgetUpdater. Diese Klasse erbt von AppWidgetProvider und überschreibt zumindest mal deren onUpdate()-Methode:

    Code:
    public class WidgetUpdate extends AppWidgetProvider {
     @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
     // Update Widgetcontent
     }
     }
    
    Diese Klasse gibt man dann in der XML als Broadcast-Receiver an:

    Code:
    <receiver android:name="WidgetUpdater" >
    ...
    </receiver>
    
    AppWidgetProvider bietet wie man der Doku entnehmen kann noch mehr Methoden an, die man bedarfsweise überschreiben kann. (weitere Doku)

    Eine Klasse, die von Activity erbt benötigt man imho nicht.

    Gruß,
    Shini
     
  9. k3nscher, 11.09.2009 #9
    k3nscher

    k3nscher Threadstarter Erfahrener Benutzer

    Beiträge:
    245
    Erhaltene Danke:
    14
    Registriert seit:
    03.09.2009
    Hey Danke, das is klar. Meine Frage ist wahrscheinlich viel zu lächerlich, wo im Quelltext kommt die klasse die appwidgetprovider überschreibt hin... also in eine neue datei mit verweis in die Hauptdatei wo mein Activity ist oder unter das Activity?

    edit: Wenn ich die Klasse unter die Activity Klasse mache kommt der Fehler:

    The public type UpdateProvider must be defined in its own file

    edit2: Verdammt ich habs... ich hab das immer versucht als outerclass zu definieren und hab natürlich public vorgeschrieben was ja totaler unsinn is, weil ja nur die main public sein darf.

    Jetz ist nurnoch die Frage warum das Widget nicht in der Widgetlist angezeigt wird....

    edit3: Auch das letzte Problem gelößt... falsch definiert in der manifest
     
    Zuletzt bearbeitet: 11.09.2009
  10. Shinigami, 11.09.2009 #10
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Ok die Frage war für mich wirklich missverständlich gestellt.

    Aber cool, dass es jetzt klappt :)

    Gruß,
    Shini
     
  11. traurick, 01.12.2009 #11
    traurick

    traurick Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    01.12.2009
    Phone:
    HTC Hero
    mhh..stundenplan von der uni downloaden genau sowas suche ich auch !!
    kannst du es vielleich zur verfügung stellen ?
     
  12. SeraphimSerapis, 01.12.2009 #12
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    Die Frage ist ja, welches System eure Uni nutzt.. Campus.Net oder ähnliches?

    Weiterhin sind Widgets auch stark limitiert - keine ScrollBars
     
  13. traurick, 01.12.2009 #13
    traurick

    traurick Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    0
    Registriert seit:
    01.12.2009
    Phone:
    HTC Hero
    basierend auf CAMPUSonline ist unser unidings ;)
    aber man müsste ja eigentlich nur das einloggen und das downloaden des stundenplans automatisieren.
     

Diese Seite empfehlen