Widget > startet code von der Main Activity

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Widget > startet code von der Main Activity

    Hallo zusammen
    hätte hier mal eine Grundlegende Frage.
    Ich möchte mich mal an einem Widget versuchen.
    Ich habe schon eine fertige App mit einer MainActivity.
    Diese führt Funktionen aus wenn ich bestimmte Buttons drücke.
    z.B. BTON, TetherinON....
    Nun möchte ich gerne ein Widget erstellen das beim drauf drücken direkt bestimmte Funktionen von der MainActivity ausführt (also z.B. BTON und TetheringON hintereinander). Ohne das sich die MainActivity öffnet.
    Auch das Widget selbst zeigt keine Buttons oder sonst was an. Also nur das Widget Icon selbst ist zu sehen.

    Ich würde gerne mal wissen wie man das grundsätzlich angehen muss bzw ob das überhaupt geht was ich da vor habe.
    Die Groben Schritte wären sehr hilfreich.
    Kann mir da jemand helfen.

    Gruß
    herrm_no
  • Neu

    Hallo
    es hat jetzt ein wenig lange gedauert, aber nun bin ich soweit.
    Ich habe nun eine App erzeugt mit einem Widget. Das Widget ändert beim Anklicken sein Icon (von rot auf grün)
    (Ich übertrage auch Daten vom "Widget" in meine MainActitvity über getSharedPreferences.
    > Die Anzahl wie oft ich das Widget angeklickt habe wird beim Aktivieren der MainActivity angezeigt. > das ist noch nicht das was ich zum Schluss erreichen will, reicht aber für den Test)

    Nun aber meine Hauptfrage. Wie kann ich z.B.beim anklicken eines Buttons direkt das Icon des Widgets ändern.
    Wie muss ich da vorgehen. Löst man das auch über "getSharedPreferences" oder gibt es da sinnvollerer Wege.


    Gruß
  • Neu

    Ich meine das Widget ICON. Das Widget ist nur ein Button der einen Befehl ausführt (z.B. Bluetooth ON/OFF) und sonst nichts.
    Es ist nicht das ICON welches die App startet.
    Das Widget Icon ändert seine Rand Farbe von Rot auf Grün beim anklicken. z.B. Bluetooth On = Grün.
    Das soll aber auch den Status ändern wenn ich z.B. in der App (MainActivity) den Button BluetoothOn drücke.
    Hier auch mal ein Bild vom Handy dazu
    Gruß
  • Neu

    Hallo

    Dein Widget was du auf dem Homescreen ist kein Icon. Das ist mit Sicherheit ein Layout. In dem du ein Imageview oder auch einen Button erstellt hast. Der Hintergrund des Layout ist wahrscheinlich transparent somit sieht du wohl nur dein Imageview.

    Du kannst auch andere Sachen in dem Layout unterbringen. Der zugriff auf die Views im Widget Layout eist aber etwas anders als in einer Activity. Dazu werden die RemodeViews benutz. Die du auch vor dem anzeigen updaten musst.Somit kannst du auch das Imageview mit einen neuen Bild setzen.


    Quellcode

    1. @Override
    2. public void onReceive(Context context, Intent intent) {
    3. super.onReceive(context, intent);
    4. RemoteViews remoteViews = new RemoteViews(context.getPackageName(), .layout.widget_layout);
    5. Bitmap bImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_image);
    6. remoteViews.setImageViewBitmap(R.id.imageView, bmp);
    7. //remoteViews.setImageViewResource(R.id.imageView, resId);
    8. //remoteViews.setImageViewIcon(R.id.imageView, resIcon);
    9. //remoteViews.setImageViewURL(R.id.imageView, Url);
    10. updateWidgetNow(context, remoteViews);
    11. }
    12. public void updateWidgetNow(Context context, RemoteViews remoteViews) {
    13. ComponentName widgetComponent = new ComponentName(context, WidgetProvider.class);
    14. AppWidgetManager.getInstance(context).updateAppWidget(widgetComponent, remoteViews);
    15. }
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P
  • Neu

    Hallo, ja du hast schon recht - es ist kein Icon sondern ein Layout (WidgetActivity). Das war jetzt total falsch von mir wiedergegeben.
    Das mit dem RemoteView hab ich ja auch so. Ich kann ja bei anklicken des platzierten Widgets die Farbe des Widgets ändern. Es ist ja eigentlich nicht die Farbe sondern ich ersetze in image mit grünen Rahmen durch ein image mit roten Rahmen.
    Das funktioniert ja auch. Ich verwende auch "onReceive" in der WidgetActivity. Mein Problem ist ja das ich in der MainActivity einen button drücke möchte und der das Image von dem Layout (WidgetActivity) ändert.
    Ich werde jetzt erst nochmal was mit deinem Code probieren und dann doch meinen code anhängen. Ich hab da scheinbar noch ein kleines Verständnisproblem.
    Ich melde mich heute noch oder morgen.
    Gruß
  • Neu

    Also von der Activiy aus kannst du nicht direkt auf das Widget zugreifen. Benutze dazu einen Intent an das Widget, und im Widget fängst du in ab und setzt wenn es der richtige Intent ist dein Imageview.

    mit dem PutExtra kannst du auch verschiedene Intes schicken die du im widget wider abfragen kannst.

    Dafür hast du ja auch den Intent in der onReceive.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • Neu

    Jetzt hab ich doch noch ein Problem bei dem ich nicht weiterkomme.
    Von der Funktion würde es so funktionieren wie gewünscht.
    Die Main Activity get auf "onPause()" und der Code springt auf "onUpdate" von der WidgetActivity.
    Allerdings krieg ich es nicht hin, dass "Update = ON" zur WidgetActivity getExtraString("UPDATE") übertragen wird.
    Beim Debuggen ist der String firstString = "Null"
    Was mach ich da verkehrt ?
    MainActivity

    Quellcode

    1. @Override
    2. protected void onPause(){
    3. super.onPause();
    4. Intent intent = new Intent(this, MainAppWidget.class);
    5. intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    6. intent.putExtra("UPDATE","ON");
    7. int[] ids = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(getApplication(), MainAppWidget.class));
    8. MainAppWidget myWidget = new MainAppWidget();
    9. myWidget.onUpdate(this, AppWidgetManager.getInstance(this),ids);
    10. }
    Alles anzeigen

    WidgetActivity

    Quellcode

    1. @Override
    2. public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    3. super.onUpdate( context, appWidgetManager, appWidgetIds );
    4. Intent intent = ((Activity)context).getIntent();
    5. //Intent intent = ((MainActivity)context).getIntent();
    6. String firstString= intent.getStringExtra("UPDATE");
    7. }
  • Neu

    Hallo in deine Code kann ich nichts erkennen wob du den Intent Überhaupt abschickst.


    Quellcode

    1. Intent intent = new Intent(MainActivity.this,MainWidget.class);
    2. intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    3. //intent.setAction("Activiy");
    4. intent.putExtra("UPDATE","ON");
    5. sendBroadcast(intent);





    Den Rest finde ich sinnlos.



    Der Intent kommt aber in der onResume Methode an. Es wird zwar auch vom System die onUpdate aufgerufen nur kannst du so dort keine Intents empfangen.



    Was soll eigentlich passieren, wenn die Activity in onPause geht?
    Ein Feedback auf Tipps ist auch schön. :P
  • Neu

    Hallo,
    danke. Hatte da einen Denkfehler. Nun funktioniert es.
    Der Widget Hintergrund wird jetzt aktualisiert wenn ich in der MainActivity einen bestimmte funktion ausführe z.B. BT ON.

    Nun nur noch eine letzte für mich schwierige Frage.
    Wenn ich das Widget drücke kann ich z.B.

    Quellcode

    1. int clicks = context.getSharedPreferences("sp", MODE_PRIVATE).getInt("clicks", 0);
    ausführen und diese wieder in der MainActivity abfragen.
    Das hilft mir aber in meinem Fall nicht viel.

    Gibt es einen Weg, wenn ich das Widget drücke dass ich ohne das öffnen der MainActivity bestimmte interne Methoden/Funktionen von der Main Activity ausführe. z.B. Tethering ON.
    Man muss doch den Code hoffentlich nicht zwei mal Programmieren.
    Ich könnte das ja wahrscheinlich leichter umsetzten wenn ich meinen Code für bestimmte Funktionen in einzelnen Klassen programmiert hätte das war aber in diesem Fall schlecht möglich da ich das mit dem TetheringOn nur in einer "Internen Class" von der MainActivity Class geschafft habe (anderes Forum Thema.)
    Zur zeit muss ich echt viel lernen :)
    Ich bin aber dankbar für jeden Tipp

    Gruß
  • Neu

    Ich hoffe mal das du für deine Activity und dein Widget verschiedene Klassen hast. Wie wäre es in der onCreate den Intent auszuwerten bevor du dein Layout startest. Also bevor du setContentView machst. Nach dem du deine Sachen gemacht hast beendest du die Activity einfach wieder, oder du überspringt den code der nicht ausgeführt werden soll.
    Ein Feedback auf Tipps ist auch schön. :P