Wie kann man vom Widget aus ein Fragment öffnen?

  • 2 Antworten
  • Neuester Beitrag
Diskutiere Wie kann man vom Widget aus ein Fragment öffnen? im Android App Entwicklung im Bereich Betriebssysteme & Apps.
Bergmann2016

Bergmann2016

Neues Mitglied
Einen wunderschönen Abend,

kann mir vllt. Jemand weiterhelfen? Ich habe eine App, wie ich schon einmal schrieb um Berechnungen durchzuführen. Nun versuche ich seit dem Mittag ein Widget dafür zu erstellen. Als Anleitung habe ich mir ein Video auf YouTube rausgesucht (Homescreen Widget #2, vom AndroidPro, ab ca. 14. Minute bis etwa 19. Minute). Nun hat meine App eine MainActivity und mehrere Fragmente, mein Gedanke ist, das Widget bekommt 5 TextViews und von ihnen aus kann direkt das passende Fragment geöffnet werden. Leider ist in dem Video nur die Rede von die App zu öffnen. Also soll mein Widget dem Benutzer den Weg über das Auswahlfenster ersparen und in gewisser Weise als Inhaltsverzeichnis dienen.

Kann man es überhaupt so machen wie ich es mir vorstelle? Oder geht das womöglich generell nicht? Denn ich fand keine vergleichbare Erklärung, wo sowas dargestellt wird. Entweder fand ich Erklärungen zu "Was ist ein Widget?" über "Welche Sorten Intents gibt es?" bis eben dem Video. Aber ich konnte mir selber keinen Reim darauf machen "Wie öffne ich ein Fragment mittels Intent?".

Also ich habe nun meine widget.class die wie folgt aussieht:

Code:
public class widget extends AppWidgetProvider {

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

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
        Intent appOpen = new Intent(context, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, appOpen,0);
        remoteViews.setOnClickPendingIntent(R.id.tv_widget_arbeit, pendingIntent);
        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);

        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }

    @override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
    }
}
Ich vermute das ich in der Zeile

Intent appOpen = new Intent(context, MainActivity.class);

meine Methode zum Anzeigen des Fragments einbauen muss. Aber Android Studio sagt mir ständig das es nicht geht. Mal weil die Methode nicht statisch ist, ein anderes mal weil die Methode private ist, ein anderes Mal wollte er einen String. Meine Methode zum Fragment anzeigen sieht so aus:
Code:
public void zeigeArbeit() {
    ViewGroup container = (ViewGroup)findViewById(R.id.container);
    container.removeAllViews();
    container.addView(getLayoutInflater().inflate(R.layout.fragment_arbeit, null));
    container.findViewById(R.id.zuruck).setOnClickListener(this);
    container.findViewById(R.id.tv_berechnen).setOnClickListener(this);

    Fenster = 1;
}
Wie gesagt, aktuell ist die Methode public (mir ist dabei nicht sehr wohl), war aber ursprünglich private.

Soweit klappt es ja auch mit dem öffnen der App, aber ich möchte gerne das spezielle Fragment öffnen.

Gerade frage ich mich, ob ich für das Fragment ggf. eine eigene Klasse schreiben muss. Dann könnte ich anstatt MainActivity.class eben Fragment_Arbeit.class ansprechen. Nur weiß ich nicht wie ich eine komplett eigene Klasse schreibe. Ist mir eh gerade bissl zu spät.

Kann mir denn bitte Jemand einen Hinweis / Tipp geben? Wäre sehr schön.
 
Zuletzt bearbeitet von einem Moderator:
N

niko132

Neues Mitglied
Guten Abend,
du bist noch ziemlich neu in der Android Entwicklung oder?
Ich würde dir empfehlen, die Grundlagen noch etwas zu vertiefen.
Das was du machst ist zum Beispiel nicht wirklich das hinzufügen eines Fragments sondern du fügst einfach die Views in der Layout Hierarchie hinzu.
Fragments können nur mit einer dazugehörigen Activity existieren und es wird normalerweise auch eine spezielle Klasse für ein Fragment geschrieben. Sie sind also so gesehen ein Paket aus Views, Variablen und Methoden, um die Entwicklung etwas übersichtlicher, leichter und effizienter zu gestalten.
Ich würde dir empfehlen, dir nochmal die Dokumentation, ein paar Tutorials und eventuell noch Beispiele zu Fragments anzuschauen.

Jetzt aber zu deinem konkreten Problem:
Wie ich schon gesagt habe gehören Fragments zu einer Activity, können also ohne diese nicht angezeigt werden. Das heißt du musst über dein Widget die Activity öffnen und dann deine Methode aufrufen, die das Fragment hinzufügt.

Dafür solltest du dem Intent noch ein extra, also ein kleines Datenpaket als zusätzliche Information geben.
Code:
...
Intent appOpen = new Intent(context, MainActivity.class);
appOpen.putExtra(MainActivity.EXTRA_ZEIGE_ARBEIT, true);
...
In deiner MainActivity prüfst du dann, ob dieses Extra auf true gesetzt ist und führst dementsprechend die Methode aus.
Code:
class MainActivity extends Activity {
    ...
    public static final String EXTRA_ZEIGE_ARBEIT = "zeige_arbeit";

    public void onCreate(Bundle savedInstanceState) {
        ...
        Intent intent = getIntent();
        if (intent != null && intent.getBooleanExtra(EXTRA_ZEIGE_ARBEIT, false)) {
            zeigeArbeit() // deine Methode um das Fragment anzuzeigen
        }
        ...
    }
    ...
}
Damit sollte es klappen :)

Und noch ein paar Tipps:
Klassennamen schreibt man in Java generell groß (Widget Klasse)
Nutze hier im Forum die code Tags, um Code übersichtlicher zu posten

LG Niko
 
Bergmann2016

Bergmann2016

Neues Mitglied
Danke für deine schnelle Hilfe Niko123.

Hast schon recht damit, dass ich noch nicht lange dabei bin.

Ich werde mir zum Thema Fragmente noch weiteres Wissen aneignen. Bevor ich an meiner App weiter programmiere.

Dein oben genannter Lösungsansatz hat leider nicht geklappt. Vielleicht bin auch nur etwas zu müde und habe was übersehen. Doch aktuell wird die App noch immer normal geöffnet und nicht dahin geleitet wo ich eigentlich hin will.

Seltsamerweise "spinnt" Android Studio nun. Nach dem ich deine vorgeschlagene Änderung gemacht habe, erkennt es diese R.class nicht mehr immer, dann kam die Meldung das ich mein minTarget von sdk 8 auf 9 hoch stellen musste. Ganz zum Schluß kam eine Fehlermeldung das im Pfad C:\Users\Ich\AndroidStudioProjects\MeineApp\app\build\intermediates irgendwas nicht gelöscht (delete) werden konnte.

Wie gesagt u.U. ist auch bei mir einfach nur der "Wurm" drin.

Wünsche noch eine angenehme Nachtruhe
 
Ähnliche Themen - Wie kann man vom Widget aus ein Fragment öffnen? Antworten Datum
3
3