Ich schreibe eine Kalender-App für Android. Diese App verfügt über eine Tages-, Wochen- und Monatsansicht, die den Standard-Kalender-Apps sehr ähnlich ist.

Alle drei Ansichten müssen wissen, welche Daten vor den Aufrufen von onMeasure, onLayout und onDraw angezeigt werden.

Jetzt habe ich mir überlegt, ob ich vollständig angepasste Ansichtsklassen erstellen oder XML-Layouts so oft wie möglich verwenden und benutzerdefinierte Ansichten nur dann in die Layouts einbetten soll, wenn dies erforderlich ist, aber ich habe mit der zweiten Option erneut eine Mauer getroffen: , da alle Layouts mindestens eine Unteransicht haben, die von den ausgewählten Daten abhängt. Die einzige Möglichkeit, Parameter an eine Ansicht zu übergeben, besteht darin, einen benutzerdefinierten Konstruktor aufzurufen (im Gegensatz zum Aufblasen, bei dem ich keine Parameter übergeben kann all) - im Grunde müsste ich komplett benutzerdefinierte Ansichten verwenden ...

Bin ich richtig? Gibt es keine Möglichkeit, Parameter an aufgeblasene Ansichten zu übergeben?

0
user884248 23 Dez. 2015 im 12:07

3 Antworten

Beste Antwort

Die Methode inflate () dient zum Konvertieren einer layout.xml in eine View-Instanz. Sie können dies tun, aber es ist viel mehr Arbeit erforderlich, und die Weitergabe dynamischer Daten scheint unmöglich.

Aber ich denke, Ihre Mauer ist keine echte Mauer:

da alle Layouts mindestens eine Unteransicht haben, die von den ausgewählten Daten abhängt.

Ich gehe davon aus, dass Sie Daten festlegen möchten, bevor die Ansicht angezeigt wird, damit Sie:

    View view = LayoutInflater.from({context}).inflate(R.layout.{XML_name}, null);
    TextView tv_year = (TextView)view.findViewById(R.id.tv_year);
    tv_year.setText("2015");
    ...
    {root_view}.addView(view);

{context} kann Ihre Aktivität sein, {XML_name} ist das, was Sie verwenden möchten, und {root_view} ist der Ort, an dem Sie Ihre Datumsansicht hinzufügen möchten.

3
Xavier.S 26 Sept. 2018 im 09:01

Sie können eine Containeransicht schreiben, um die Tagesansicht, die Wochenansicht und die Monatsansicht hinzuzufügen. Dies ist ein Rückruf, wenn auf die Tagesansicht geklickt oder gescrollt wird, um die Wochenansicht und die Monatsansicht zu benachrichtigen

0
Scofield 23 Dez. 2015 im 09:15

Dies ist eine gute Vorgehensweise: Durch das Trennen von Ansichten vom Funktionscode wird die Lesbarkeit verbessert. Sie können benutzerdefinierte Klassen aus Ihrer custom_layout.xml definitiv in Ihren Code aufblasen. Legen Sie dazu Ihre benutzerdefinierte Klasse (aus einer bestimmten Ansicht erweitert) als Namen eines Tags fest:

<com.my_site.MyView>
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/my_view"
</com.my_site.MyView>

Wenn Ihr benutzerdefinierter Ansichtsklassenkonstruktor zusätzliche Parameter akzeptiert, benötigen Sie außerdem benutzerdefinierte LayoutInflator-Factory Sie können diese Parameter einstellen. Um diesen Ansatz für verschiedene Fälle gleich zu machen, können Sie immer eine einzelne Instanz der MyParameters-Klasse übergeben, die Parameterwerte verschiedener Typen akzeptiert und diese im Zielkonstruktor zurückgibt.

In meinem Fall war es einfacher, alle Anpassungen vom Konstruktor an separate Methoden weiterzugeben, um sie nach der Instanziierung von MyView aufzurufen.

0
Zon 30 Mai 2017 im 05:32