Beiträge von Marco Feltmann

    In Java kannst Du bequem Inline Funktionen und anonyme Inline Klassen erstellen.

    Java
    class MyClass {
      void method() {
        alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int which) {
          	Toast.makeText(getActivity().getApplicationContext(), "You clicked on OK", Toast.LENGTH_SHORT).show();
          }
        });
      }
    }


    ist ungefähr dasselbe wie

    Java
    class MyClass implements DialogInterface.OnClickListener() {
      void method() {
        alertDialog.setPositiveButton("OK", this);
      }
      public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(getActivity().getApplicationContext(), "You clicked on OK", Toast.LENGTH_SHORT).show();
      }
    }


    und auch das gleiche wie

    Java
    class MyListener implements DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(getActivity().getApplicationContext(), "You clicked on OK", Toast.LENGTH_SHORT).show();
      }
    }
    class MyClass {
      void method() {
        alertDialog.setPositiveButton("OK", new MyListener());
      }
    }


    Du hast für die Implementierung solcher Interfaces immer diese drei Möglichkeiten.

    • Ist nur eine Kleinigkeit, die für jedes 'onClick' anders ist. Mach es als anonyme innere Klasse.
    • Ist ne Menge an Aufwand, die für jedes 'onClick' gleich ist. Implementiere das Interface in der aufrufenden Klasse.
    • Ist ne Menge an Aufwand, die für jedes 'onClick' unterschiedlich ist. Implementiere das Interface in je eine eigene Klasse.

    Also zunächst mal: Voice Over IP statt Intercom?


    In der Theorie ist es durchaus möglich, sowohl auf der Klinke Daten zu empfangen und zu senden als auch via Bluetooth zu kommunizieren.
    Ob und wie ein internes Routing durchzuführen ist kann ich nicht beurteilen. Zumindest in iOS wird das Routing automatisch vorgesetzt.
    Mir ist auch kein Weg bekannt unter Android zu sagen 'Wenn was bei Klinke anliegt sende zu Bluetooth und vice versa'


    Da wirst Du wohl um sehr lange sehr eingehende Lektüre nicht umhin kommen.


    Zumal der Hauptaufwand dann die Implementierung der eigentlichen Intercom Systeme werden dürfte:
    Keepalives beantworten, unnötige Befehle ignorieren, notwendige Befehle beantworten, das Sprachrouting hin und her schieben, Echo Canceller und Silencer implementieren…


    Ist ein schönes Projekt. :)

    1) Ja.
    Wenn Du das dort nicht machst, dann erstellt das OnCreate() der Main Activity einfach neue Fragments.
    Dann dürfte es denen auch ziemlich egal sein, ob sie an anderer Stelle schon mal erstellt wurden.


    Der zweite Teil der Frage sollte durch mein erstes Code Listing doch bereits beantwortet sein.


    2) Es gibt die Möglichkeit, dass Du pro Darstellung ein anderes UI zur Verfügung stellst. Das UI wird durch eine Activity dargestellt.
    Insofern musst Du da gar keinen Namen eingeben, sondern das zweite Code Listing einfach vor dem schon existierenden Namen in Deine AndroidMainfest.xml eintragen.

    Ohne genaue Fehlerausgabe schwierig.


    Vermutlich setzt du mit myFileDialog.setView(rootView) das RootView des Fragmentes, das Framework vermutet dahinter ein eigenes View, die gesamte Hierarchie kommt durcheinander und es kracht.

    Hallo Gutelo,


    zu Deinen Fragen:


    1] Ja, das ist okay so. Es ist natürlich immer schöner, wenn so wenig Abhängigkeiten wie möglich bestehen.
    Wenn nicht gleich beim Konstruieren des Objektes aus mit den Berechnungen los gelegt wird, könntest Du das Ganze auch noch um Setter erweitern.
    Du müsstest nur dafür sorgen, dass bei ungesetzten Werten die Sache stabil weiter läuft.


    2] Tja, das ist eine schwierige Frage. Damit würdest Du ja die Ausgabe direkt beeinflussen. Ganz genau genommen gehört das Plotting ja eher in den View und nicht in die Daten. Allerdings nutzt Du ja ein Plotting Framework, dass sich um die Darstellung im View kümmert.
    Insofern agiert Deine Klasse mehr als Controller zwischen den Schichten, und da ist es durchaus okay, diese Schnittstelle nach außen hin offen anzubieten – wenn Du sie denn wirklich dringend von Außerhalb brauchst.


    3] Das ist nicht ganz richtig. Du kannst in Deinen Methoden, die Exceptions werfen können, diese Exceptions auch abfangen und die Daten entsprechend so manipulieren, dass Du immer noch eine funktionale Komponente hast.
    Statt 'BAM! FileNotFoundException!' kannst Du auch Deinen Graphen so plotten, dass er leer ist und die Achsenbeschriftung 'File Not Found' heißt.
    Das kannst Du also ganz so implementieren wie Du möchtest. (Ich bevorzuge es, möglichst keinerlei Exceptions zu haben.)


    4] Ja.
    Es sei denn, Du unterbindest das.
    Möglichkeit 1)
    Die OnCreate Deiner Activity wie folgt aufbauen:


    Oder Du erklärst dem Manifest, dass sich Dein UI mitdrehen soll (wenn Du ein UI für alle Darstellungen hast)

    HTML
    <activity android:configChanges="screenSize|orientation"
    android:name="…

    Ja, ich versteh ein bisschen besser.
    Der Nachteil an der Nutzung skalarer Arrays ist, dass sie ziemlich unveränderlich sind.


    Wenn Du dringend auf Hardwarenähe und Geschwindigkeit angewiesen bist, solltest Du das vermutlich lieber in C realisieren.


    Ansonsten wäre es vermutlich sinnvoller, ein Objekt mit der Zuordnung von current_digits und current_ampere in ein Java Array zu packen, da diese von Natur aus mitwachsen und man sich darum nicht zu kümmern braucht.


    PS: Ich habe Deinen letzten Beitrag so verstanden, dass es jetzt läuft. Insofern gehe ich nicht weiter auf die Implementierung ein. :)

    Es ist eigentlich ganz logisch, dass das so nicht funktioniert.
    getApplicationContext() ist eine Methode von Activity. Sobald sich Deine Klasse nicht mehr im Bereich einer Activity befindet (als innere Klasse ist sie das ja noch), kann diese Methode nicht gefunden werden.


    Du könntest den Context als Parameter an Deinen Async Task übergeben.
    Alternativ könntest Du auch nur die für diese spezielle Verbindung benötigten Daten als Parameter an Deinen Async Task übergeben.

    Sooo, langsam reicht es mir. :P


    Du kommst von Delphi. Das ist schön.
    Allerdings versuchst Du, Delphi Konzepte in Java zu übernehmen. Das ist Mist.


    Fragen stellen kannst Du offensichtlich auch nicht.
    Du erzählst zwar was Du versuchst und dass es nicht klappt, aber das reicht nicht.


    Oder rufst Du den ADAC an und sagst: "Ich hab den Zündschlüssel gedreht, aber das Auto funktioniert nicht richtig!" wenn Du feststellst, dass die Warnleuchte für die Inspektion an geht?


    Fragen gliedern sich im Allgemeinen nach den folgenden vier Gesichtspunkten.

    • Was will ich erreichen?
    • Was habe ich versucht?
    • Was habe ich erwartet?
    • Was habe ich bekommen?


    In Deinem Fall möchtest Du also komplexere Datentypen ähnlich der Records in Delphi haben. (1)
    Du hast es mit der Implementierung einer public class versucht. (2)
    [Im Übrigen wäre Deine Frage damit auch beantwortet. Es gibt keine Records. Komplexere Datentypen werden wie in anderen objektorientierten Programmiersprachen (so auch Objective Pascal/Delphi) in Objekten dargestellt. Diese Objekte benötigen in Java eine Klasse. Und damit sie jeder nutzen kann, muss diese Klasse als public definiert sein.]


    Die Punkte (3) und (4) fehlen in Deiner Aufstellung gänzlich.
    Wie soll man Dir in dem Punkt also helfen können?


    Und wie an anderer Stelle schon einmal erwähnt: es ist durchaus hinderlich zu fragen, wie Du ein Delphi Konzept in Java umgesetzt bekommst. Wären die Konzepte gleich hieße Java Delphi oder Delphi hieße Java.
    Also frag am Besten immer, was Du erreichen möchtest.

    Da hast Du Dir aber die Nacht um die Ohren gehauen. ;)


    Ja, es ist eine sehr gute Idee, Instanzvariablen anzulegen, wenn man sie methodenübergreifend benutzen will.


    Allerdings würde ich es weder RV noch rootView nennen.
    plotView wäre vermutlich angebrachter, wenn es das View sein soll, in das geplottet werden soll.


    Auch kannst Du Dir eine Zuweisung sparen.

    Java
    View rootView = inflater.inflate(R.layout.fragment_graph, container, false); 
    RV = rootView;
    
    
    // Ist dasselbe wie
    
    
    RV = inflater.inflate(R.layout.fragment_graph, container, false);

    Also irgendwie sehe ich da eine Aneinanderreihung von Befehlen ohne direkten Bezug zueinander.


    Ich kann beim besten Willen nicht erkennen, was Du da genau versuchst.
    Und das liegt nicht nur daran, dass der Quellcode unleserlich formatiert ist.


    Aber eventuell hilft es, wenn Du einen FileOutputStream anstelle eines ByteArrayOutputStream benutzt?

    Den kompletten Inhalt einzukopieren ist auch nicht so einfach.
    Die gewünschte Zeile auswählen, kopieren und einfügen sollte klappen.


    Dann bekommst Du auch die genaue Zeile in Deiner Java Datei genannt und kannst besser eingrenzen, wobei es kracht.


    Wenn (aus welchen Gründen auch immer) Dein Holder zerstört wurde, ist das durchaus eine Berechtigung für eine Null Pointer Exception.