Aus einem String eine funktion starten

  • Antworten:25
Volkan Aydin
  • Forum-Beiträge: 187

12.07.2014, 19:38:05 via Website

Ich habe eine Spezielle Idee, und weiss nicht wie dies realisierbar ist, ob überhaupt es realisirbar ist.

ich will über einen String[][] und einer for-scleife eine funktion aufrufen. und zwar mit equals. DAfür habe ich einen Code gefunden (zuunterst) jedenfalls habe ich als einziges was ich nicht wusste was ich damit anfangen soll = Object obj, da habe ich einfach auf null gesetzt ;)

Genauer gesagt soll es folgendermassen dann aussehen

in der hauptactivity =

public void goPRechner(View view){
    alertListView alw =new alertListView();
    Context ctx = this;
    String titel = "Bitte Auswählen";
    int viewGroup = android.R.layout.simple_list_item_1;
    Resources res =getResources();
    int menu = R.array.rechner_glasrechner_auswahl;
    String[][] gofunktion = {
            {"Neues Projekt","startNewProjekt()"},
            {"Vorhandenes Projekt","loadProjekt()"}
    };
    alw.showSingleDialog(view, ctx, titel , viewGroup , res ,menu , gofunktion);


}

und die alertListView erstellt dann die Liste

public class alertListView{

public void showSingleDialog(View view, Context ctx,String titel,int viewGroup, Resources res, int menu,final String[][] gofunktion){
            AlertDialog.Builder builderSingle = new AlertDialog.Builder(ctx);
         builderSingle.setIcon(R.drawable.ic_launcher);
         builderSingle.setTitle(titel);
         final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(ctx,viewGroup);          
         String[] al = res.getStringArray(menu);
         for(int i=0;i<al.length;i++){
            arrayAdapter.add(al[i].toString()); 

         }
         builderSingle.setNegativeButton("Abbrechen",
                 new DialogInterface.OnClickListener() {

                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         dialog.dismiss();
                     }
                 });

         builderSingle.setAdapter(arrayAdapter,
                 new DialogInterface.OnClickListener() {

                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         Log.i("shwoSingleDialog","oncklicklistener activ");
                         String strName = arrayAdapter.getItem(which);

                         for(int i=0;i<gofunktion.length;i++){
                             Log.i("shwoSingleDialog","oncklicklistener forschleife activ");
                            if(strName.equals(gofunktion[i][0])){
                                Log.i("shwoSingleDialog","oncklicklistener equalsfrom gofunktion activ");
                                java.lang.reflect.Method method;
                                Object obj = null;
                                String methodName = gofunktion[i][0];
                                try {
                                      method = obj.getClass().getMethod(methodName);
                                    } catch (SecurityException e) {
                                      Log.i("loadfunktion SE",e.toString());
                                    } catch (NoSuchMethodException e) {
                                        Log.i("loadfunktion NSME",e.toString());
                                    }
                            }
                         }
                         dialog.dismiss();
                     }
         });
         builderSingle.show();// TODO Auto-generated method stub
}

}

Jedenfalls bereit mir dies ein Problem:

java.lang.reflect.Method method;
                            Object obj = null;
                            String methodName = gofunktion[i][0];
                            try {
                                  method = obj.getClass().getMethod(methodName);
                                } catch (SecurityException e) {
                                  Log.i("loadfunktion SE",e.toString());
                                } catch (NoSuchMethodException e) {
                                    Log.i("loadfunktion NSME",e.toString());
                                }

Ich habe diesen Code im Internet gefunden, aber aus irgendeinem Grund haut es mir immer den Code um die Ohren und ich weiss nicht wieso :(, hier der Log

07-12 17:16:18.286: I/shwoSingleDialog(1702): oncklicklistener activ

07-12 17:16:18.286: I/shwoSingleDialog(1702): oncklicklistener forschleife activ
07-12 17:16:18.286: I/shwoSingleDialog(1702): oncklicklistener equalsfrom gofunktion activ
07-12 17:16:18.321: D/AndroidRuntime(1702): Shutting down VM
07-12 17:16:18.321: W/dalvikvm(1702): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
07-12 17:16:18.386: E/AndroidRuntime(1702): FATAL EXCEPTION: main
07-12 17:16:18.386: E/AndroidRuntime(1702): java.lang.NullPointerException
07-12 17:16:18.386: E/AndroidRuntime(1702): at com.awad.awad_glasrechner.alertListView$2.onClick(alertListView.java:51)
07-12 17:16:18.386: E/AndroidRuntime(1702): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941)
07-12 17:16:18.386: E/AndroidRuntime(1702): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
07-12 17:16:18.386: E/AndroidRuntime(1702): at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
07-12 17:16:18.386: E/AndroidRuntime(1702): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
07-12 17:16:18.386: E/AndroidRuntime(1702): at android.widget.AbsListView$1.run(AbsListView.java:3423)
07-12 17:16:18.386: E/AndroidRuntime(1702): at android.os.Handler.handleCallback(Handler.java:725)
07-12 17:16:18.386: E/AndroidRuntime(1702): at android.os.Handler.dispatchMessage(Handler.java:92)
07-12 17:16:18.386: E/AndroidRuntime(1702): at android.os.Looper.loop(Looper.java:137)
07-12 17:16:18.386: E/AndroidRuntime(1702): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-12 17:16:18.386: E/AndroidRuntime(1702): at java.lang.reflect.Method.invokeNative(Native Method)
07-12 17:16:18.386: E/AndroidRuntime(1702): at java.lang.reflect.Method.invoke(Method.java:511)
07-12 17:16:18.386: E/AndroidRuntime(1702): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-12 17:16:18.386: E/AndroidRuntime(1702): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-12 17:16:18.386: E/AndroidRuntime(1702): at dalvik.system.NativeStart.main(Native Method)
07-12 17:16:22.526: I/Process(1702): Sending signal. PID: 1702 SIG: 9

Antworten
Klaus T.
  • Forum-Beiträge: 8.183

12.07.2014, 19:51:11 via Website

Ist doch klar....
obj wird auf Null gesetzt und ein Stück tiefer machst du obj.getClass(). Das muss ja knallen :D
Die NPE wird außerdem auch nicht ge'catched....

— geändert am 12.07.2014, 19:53:00

if all else fails, read the instructions.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.640

12.07.2014, 19:54:32 via App

Welche zeile ist die 51. in der AlertListView?

Ich sammle gerne Namen in meinem Death Note.

Samsung Galaxy Note 2<3 -> Samsung Galaxy Note 3 <3

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.07.2014, 20:00:27 via Website

Zudem wird eine Object Klasse niemals deine gesuchte Funktion enthalten.
Wenn dann musst du eine Klasse haben, die deine gewünschten Methoden enthält.

Als alternative würde mir noch die Native lösung einfallen:

  String s = "deineMethode";
Object obj = hanleMethodString(s);


//und dann die Methode:

private Object handleMethodString(String s)
{

if(s.equals("yourFirstMethod"))
{
deineKlasse.deineEersteMethode();
}
else if (s.equals())
{
//so was &auml;hnliches wie oben.
}

}

Natürlich ist mir klar, dass mein Vorschlag nicht sehr Effizient ist.
Über die Reflections ist es eindeutig besser.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

12.07.2014, 20:18:15 via Website

wow, heute is ja was los :) gleich drei antworten....

nachdem ich gepostet habe, habe ich weiter gegoogelt und mal andere begriffe verwendet anstatt methode.. z.b. class :) vieleicht kann man das ganze noch viel einfacher lösen????

und dann habe ich das gefunden =

                                String methodName = gofunktion[i][1];
                                try {
                                    Class.forName(methodName);

                                } catch (ClassNotFoundException e) {
                                    Log.i("classnameError",e.toString());
                                    e.printStackTrace();
                                }

da ich aber diese class in eine externe datei ausgelagert habe muss ich wahrscheinlich nur noch die activity angeben wo die funktion zu finden ist, den der fehler ist nun :

java.lang.ClassNotFoundException: startNewProjekt

ich habe es mit ctx.Class.forName(methodName) versucht, geht aber nicht auch :( was währe Korrekt?.

Ich habe auch versucht (nur zum testen) activity.Class.forName(methodName); will ebenfalls nicht funktionieren...? andere Tipps?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.07.2014, 20:27:11 via Website

Class#forName -> Suchen einer Klasse per Sting.
Das ist nicht das was du willst.
Der erstere Versuch war näher dran.

— geändert am 12.07.2014, 20:27:20

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

12.07.2014, 20:40:14 via Website

danke Pascal P. ... schade :(, aber ich glaub dir mal ;)

Also habe alles ge'ctrl+z... bis zu dem Punkt als ich euch gefragt habe...

Alex Wieser = Zeile 51 ist = method = obj.getClass().getMethod(methodName);

Also es ist definitiv dort (der Fehler).

@Pascal P . Dein ansatz währe interessant. ich bin aber ein fauler sack, ich lege mir immer Fertige Classen an, damit ich diese überall hin kopieren kann ohne etwas daran zu ändern, auch für zukünftige und andere Projekte. also MUSS es Global erreichbar sein. so z.b. habe ich das mit den Anroid Cookies gemacht (SavePreferences)... deshalb dieser umweg.... Wenn ich es bis morgen abend nicht fertig bringe werde ich auf deine methode zurückgreifen ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.07.2014, 20:46:03 via Website

Also Faulheit unterstütze ich nicht :)
Es ist nicht sehr schwierig soetwas umsetzen.
Also wenn du noch Motivation hast, kann ich dir helfen, sonst musst du selber schauen, wie du dein Problem löst.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

12.07.2014, 20:55:57 via Website

Also mit Faulheit meine ich.... ich will will nicht alle vorgänge immer und immer wiederholen müssen, so habe ich mir eine Komplette Classe zugelegt für Sqlite arbeiten oder eben SavePreferences, auch für MySQL abrafen übers internet habe ich mir fertig gestellt, so das ich bei neuen Projekten diese Klasse einfach einfügen kann, und direkt loslegen kann mit den arbeiten.

Ansonsten bin ich hochmotiviert.....

Was ich ebne nicht will ist in dieser Datei noch was ändern zu müssen.. also dein erster Vorschlag müsste in der activity umgesetzt werden ohne diese Classe zu verändern....

Kann man eine Klasse einfach übergeben?

wie z.b. einen String?

String string = "string";
Class class = dieseklasse();

undDieseWeitergeben(class);

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

12.07.2014, 22:31:06 via Website

Also.....

Ich dreh mich im Kreis... ich habe dutzende versuche gestartet, alle endeten im Desaster :)

Letzter versuch sah so aus

java.lang.reflect.Method method = null;

                                try {
                                    Object obj = null;
                                      method = obj.getClass().getMethod(methodName);
                                      method.invoke(obj);
                                    } catch (SecurityException e) {
                                      Log.i("loadfunktion SE",e.toString());
                                    } catch (NoSuchMethodException e) {
                                        Log.i("loadfunktion NSME",e.toString());
                                    } catch (IllegalArgumentException e) {
                                    } catch (IllegalAccessException e) {
                                    } catch (InvocationTargetException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }

Und der Log sieht so aus:

07-12 20:28:41.276: I/shwoSingleDialog(1457): oncklicklistener equalsfrom gofunktion activ
07-12 20:28:41.286: D/AndroidRuntime(1457): Shutting down VM
07-12 20:28:41.286: W/dalvikvm(1457): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
07-12 20:28:41.306: E/AndroidRuntime(1457): FATAL EXCEPTION: main
07-12 20:28:41.306: E/AndroidRuntime(1457): java.lang.NullPointerException
07-12 20:28:41.306: E/AndroidRuntime(1457): at com.awad.awad_glasrechner.alertListView$2.onClick(alertListView.java:55)
07-12 20:28:41.306: E/AndroidRuntime(1457): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941)
07-12 20:28:41.306: E/AndroidRuntime(1457): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
07-12 20:28:41.306: E/AndroidRuntime(1457): at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
07-12 20:28:41.306: E/AndroidRuntime(1457): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
07-12 20:28:41.306: E/AndroidRuntime(1457): at android.widget.AbsListView$1.run(AbsListView.java:3423)
07-12 20:28:41.306: E/AndroidRuntime(1457): at android.os.Handler.handleCallback(Handler.java:725)
07-12 20:28:41.306: E/AndroidRuntime(1457): at android.os.Handler.dispatchMessage(Handler.java:92)
07-12 20:28:41.306: E/AndroidRuntime(1457): at android.os.Looper.loop(Looper.java:137)
07-12 20:28:41.306: E/AndroidRuntime(1457): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-12 20:28:41.306: E/AndroidRuntime(1457): at java.lang.reflect.Method.invokeNative(Native Method)
07-12 20:28:41.306: E/AndroidRuntime(1457): at java.lang.reflect.Method.invoke(Method.java:511)
07-12 20:28:41.306: E/AndroidRuntime(1457): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-12 20:28:41.306: E/AndroidRuntime(1457): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-12 20:28:41.306: E/AndroidRuntime(1457): at dalvik.system.NativeStart.main(Native Method)

Im moment weiss ich nicht weiter. Könnt ihr mir einen Link geben? ich habe es mit http://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-the-method-name-as-a-string versucht... bin mir aber nicht sicher ob das das ist was ich brauche, mein englisch is bäd!

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.07.2014, 22:33:18 via Website

In deinem Geposteten Beitrag steht doch alles wichtige drin:

    Class<?> c = Class.forName("class name");
Method  method = c.getDeclaredMethod ("method name", parameterTypes)
method.invoke (objectToInvokeOn, params)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

12.07.2014, 22:45:32 via Website

ich habe diese versucht, nur leider verstehe ich sie nicht!

So würde es aussehen wenn ich es verwende......

    String className = "com.awad.projekt.";
                                String methodName = gofunktion[i][1];

                                Class<?> c = Class.forName(className);
                                Method  method = c.getDeclaredMethod (methodName, null);
                                method.invoke (objectToInvokeOn, params);

Also Problem Nr.1
Bei c.getDeclaredMethod (methodName, null) kommt bei eclipse die fehlermeldung = The argument of type null should explicitly be cast to Class<?>[] for the invocation of the varargs method getDeclaredMethod(String, Class<?>...) from type Class<capture#2-of ?>. It could alternatively be cast to Class<?> for a varargs invocation ...

ICH gar nix verstehen!

Problem 2 : was wird hier gesucht? objectToInvokeOn ???

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

12.07.2014, 22:50:12 via Website

o.k. ich glaube frage eins konnt ich mir selbst beantworten, jetzt sieht es so aus

String className = "com.awad.awad_glasrechner.";
                                String methodName = gofunktion[i][1];

                                Class<?> c = Class.forName(className);
                                Method  method = c.getDeclaredMethod (methodName, c);
                                method.invoke (objectToInvokeOn, null);

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.07.2014, 23:01:09 via App

Bei class name muss aber der name der klasse rein in der die aufzurufende methode sich befindet.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

12.07.2014, 23:11:18 via Website

Danke für den Tipp habe ich geändert.

String className = "com.awad.awad_glasrechner.rechner.";
                                String methodName = gofunktion[i][1];                                   
                                Class<?> c = Class.forName(className);
                                Method  method = c.getDeclaredMethod (methodName, c);                                                                       
                                method.invoke (objectToInvokeOn, null);

Nun ist ja eigentlich nur noch das Problem mit objectToInvokeOn... Das habe ich versucht....

@SuppressWarnings("null")
                    @Override
                     public void onClick(DialogInterface dialog, int which) {
                         Log.i("shwoSingleDialog","oncklicklistener activ");
                         String strName = arrayAdapter.getItem(which);

                         for(int i=0;i<gofunktion.length;i++){
                             Log.i("shwoSingleDialog","oncklicklistener forschleife activ");
                            if(strName.equals(gofunktion[i][0])){
                                Log.i("shwoSingleDialog","oncklicklistener equalsfrom gofunktion activ");
                                String className = "com.awad.awad_glasrechner.rechner.";
                                String methodName = gofunktion[i][1];
                                Object o = null;
                                try {
                                    Class<?> c = Class.forName(className);
                                    Method  method = c.getDeclaredMethod (methodName, c);
                                    o.getClass().getMethod(methodName, c);
                                    method.invoke (o, c);
                                } catch (ClassNotFoundException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (NoSuchMethodException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (IllegalAccessException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (IllegalArgumentException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (InvocationTargetException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }

                            }
                         }
                         dialog.dismiss();
                     }

K.A!!!! :)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

12.07.2014, 23:48:18 via Website

OK, ein Update...

Der Stand der Dinge sieht so aus ...

String className = "com.awad.awad_glasrechner.rechner";
                                String methodName = gofunktion[i][1];
                                try {
                                    Class<?> c = Class.forName(className);
                                    Method  method = c.getDeclaredMethod (methodName, c);

                                    method.invoke (method);
                                } catch (ClassNotFoundException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (NoSuchMethodException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (IllegalAccessException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (IllegalArgumentException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (InvocationTargetException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }

Die Log sieht dann so aus....

    07-12 21:45:11.136: W/System.err(3010): java.lang.NoSuchMethodException: loadProjekt() [class com.awad.awad_glasrechner.rechner]
07-12 21:45:11.146: W/System.err(3010):     at java.lang.Class.getConstructorOrMethod(Class.java:460)
07-12 21:45:11.146: W/System.err(3010):     at java.lang.Class.getDeclaredMethod(Class.java:685)
07-12 21:45:11.146: W/System.err(3010):     at com.awad.awad_glasrechner.alertListView$2.onClick(alertListView.java:54)
07-12 21:45:11.146: W/System.err(3010):     at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941)
07-12 21:45:11.146: W/System.err(3010):     at android.widget.AdapterView.performItemClick(AdapterView.java:298)
07-12 21:45:11.156: W/System.err(3010):     at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
07-12 21:45:11.156: W/System.err(3010):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
07-12 21:45:11.156: W/System.err(3010):     at android.widget.AbsListView$1.run(AbsListView.java:3423)
07-12 21:45:11.156: W/System.err(3010):     at android.os.Handler.handleCallback(Handler.java:725)
07-12 21:45:11.156: W/System.err(3010):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-12 21:45:11.156: W/System.err(3010):     at android.os.Looper.loop(Looper.java:137)
07-12 21:45:11.166: W/System.err(3010):     at android.app.ActivityThread.main(ActivityThread.java:5041)
07-12 21:45:11.166: W/System.err(3010):     at java.lang.reflect.Method.invokeNative(Native Method)
07-12 21:45:11.166: W/System.err(3010):     at java.lang.reflect.Method.invoke(Method.java:511)
07-12 21:45:11.176: W/System.err(3010):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-12 21:45:11.176: W/System.err(3010):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-12 21:45:11.176: W/System.err(3010):     at dalvik.system.NativeStart.main(Native Method)

Ich spüre es!! ich bin nah dran :), jetzt geh ich aber schlafen. Vielen Dank für die hilfe!

Antworten
Georg C.
  • Forum-Beiträge: 235

13.07.2014, 00:24:49 via Website

Hallo,
ich gucke hier (ins Forum) ab und zu, und verstehe manches nicht.
...

Der Klaus hat mit seiner Antwort ALLES! - gesagt.
Was macht Ihr dar weiter?
???
...
Gestern habe ich nach einem getItem(position) Code; - für meinen View v Layout gesucht,
habe zwar was für den Item gefunden, aber das onClick generiert Fehler ... (laughing)
... o my god

Versuche es damit:

public class Main extends ListActivity 
{

....

String[] items = new String[]{"Habe Code fuer String", "Funktioniert nicht", "Gibt es selbe Code fuer Int", "Ja - habe im Net gefunden", 
                            "Funktioniert- danke - aber jetzt funktioniert string nicht", "Kan mir keiner helfen"};

        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.HIER_DEIN!!!_LAYOUT, items));        
    }

    protected void onListItemClick(ListView l, View v, int position, long id)
    {
        super.onListItemClick(l, v, position, id);

        Object o = this.getListAdapter().getItem(position);
        String keyword = o.toString();

        if( keyword.equals( "Habe Code fuer String" ) )
            {
            // LERNE to .... JAVA
            }

        if( keyword.equals( "Funktioniert nicht" ) )
        {
        //  foo .... LERNE to ANDROID
        }
        ....

        if( keyword.equals( "Kan mir keiner helfen" ) )
        {
        //  foo .... LERNE
        }
        ...

Du kannst dafür, aber auch eine "separate / eigene" Class erzeugen.

public class HIER_NAME extends ListActivity{ ... aber auch das erben ist nicht zwang! ...

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

13.07.2014, 11:04:32 via Website

Sorry Georg :) ich will wissen wie ich aus einem String eine funktion starten kann, und zwar mit dessen namen.... damit ich diese mit dem String mitgeben kann... also sieht dass dan etwa so aus....

String[][] classen = {
{"Geh dort hin","aufgabe1()"},
{"Mach das", "aufgabe2()"}
}

Genau so will ich die funktion aufrufen können, und nicht anders....

Ich bin ganz ehrlich, es gäbe viele möglichkeiten, und eure vorschläge sind ja alle Korrekt und währen auch einfacher, ist aber nicht global verwendbar, weil ich nicht für jedenfall eine neue if() schreiben will.
Diese Klasse soll Global anwendbar sein.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.07.2014, 11:11:13 via App

Besitzt denn deine Klasse rechner eine Methode namens loadProject ?

— geändert am 13.07.2014, 11:11:27

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Klaus T.
  • Forum-Beiträge: 8.183

13.07.2014, 11:34:19 via Website

Hast du denn überhaupt eine Klasse mit Methoden, die irgendxwie mit den Einträgen in deinem String-Array verknüpft werden könnte?
Ich sehe bisher nur WirrWarr ohne erkennbaren Hintergrund in den Code-Schnipseln....

Sorry, aber "wie ich aus einem String eine funktion starten kann" klingt total planlos ;)

— geändert am 13.07.2014, 11:35:51

if all else fails, read the instructions.

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

13.07.2014, 11:44:42 via Website

es ist aber genau das was ich suche! :)

Also ich glaube Pascal P. weiss was ich meine, aber ich versuchs nochmal!

Ich möchte ein Klasse haben, die ein Alertdialog erzeugt. und zwar soll die Klasse endgültig sein!

Nun möchte ich, eine neue Activity machen mit eben diesem AlertDialog, mit einer Listview. Dann möchte ich NUR die Klasse einbinden (alw) und NUR diese VARIABLEN mitgeben müssen.

alertListView alw =new alertListView();
    Context ctx = this;
    String titel = "Bitte Ausw&auml;hlen";
    int viewGroup = android.R.layout.simple_list_item_1;
    Resources res =getResources();
    int menu = R.array.rechner_glasrechner_auswahl;
    String[][] gofunktion = {
            {"Neues Projekt","startNewProjekt"},
            {"Vorhandenes Projekt","loadProjekt()"}
    };

Diese gebe ich dann so weiter .

alw.showSingleDialog(view, ctx, titel , viewGroup , res ,menu , gofunktion);

und diese mehrdimensionalem array enthält die gleichen wörter des R.array.rechner_glasrechner_auswahl. für die if abfrage die dan später folgt.

es funktioniert alles wunderbar, bis eben auf das, ich will das gofunktion[0][1] nun die klasse aufruft, auf der aktuellen aktivity...........

Antworten
Georg C.
  • Forum-Beiträge: 235

14.07.2014, 01:38:45 via Website

Sorry Volkan Aydin,

ich will wissen wie ich aus einem String eine funktion starten kann
...

(In der Java heißen Funktionen -> Methoden.)
Aus einem String, (kann sogar 4- Dimensionaler String sein!) kann man KEINE! Methode ausführen / "starten" - FERTIG

... es funktioniert alles wunderbar, bis eben auf das, ich will das
gofunktion[0][1] nun die klasse aufruft ...

Sehe oben!

Einziges was dir Hilft, ist ->die Grundlagen zu lernen - ja ich weis - das brauchst du nicht.
Irgendwo findest du schon eine "Global anwendbar / global verwendbar" (WAS???) Klasse, welche für deine zwecke .... (damit du eine if Schleife nicht schreiben muss) passt.
Deine Logik ist .... sehr! merkwürdig.
Jedoch viel Spaß bei suchen.

Vorlage:
<Code>
String[][] classen = {
{"Geh dort hin","aufgabe1()"},
{"Mach das", "aufgabe2()"}
}
</Code>

Das soll dir eigentlich helfen:
Die / eine / ?deine:

showSingleDialog(view, ctx, titel , viewGroup , res ,menu , gofunktion);

Methode MUSS! mit dem <Code> gofunktion </Code> Parameter was anfangen können, sonnst wird ebenso NIX!

showSingleDialog( ....  .....  String gofunktion)
{
    .....

    if(gofunktion.equals("Geh dort hin") ) 
    {
        // rufe die aufgabe1() Methode
        aufgabe1(); // hier ist fraglich wo? ...  in welcher Klasse? .... die Methode implementiert ist
    }

        // bzw. 
        String mach_das =  "Mach das";
        if(gofunktion == mach_das ) 
        {
            // rufe die aufgabe2() Methode
            aufgabe2(); // hier ist fraglich ....
        }
}

Ein Versuch eine passende Klasse (laut deinem letzt- Post) zu "basteln" könnte so aussehen:

public class AlertListView 
{

    public AlertListView() { }

    // Vermute View Objekt -> ?View view
    public void showSingleDialog(?View view, Context ctx, String titel , int viewGroup , Resources res , int menu , String gofunktion)
    {
        if(gofunktion.equals("Geh dort hin") ) 
        {
            // rufe die aufgabe1() Methode
            aufgabe1();
        }
        // bzw. 
            String mach_das =  "Mach das";
            if(gofunktion == mach_das ) 
            {
                // rufe die aufgabe2() Methode
                aufgabe2();
            }
    }

        public void aufgabe1()
        {
            // ich gehe dort hin 
        }

            public void aufgabe2()
            {
                // ich mache das 
            }
}

LG
Georg

Ps.
Klassen Namen sollen mit einer Großbuchstabe anfangen.
&
ich bin raus

— geändert am 14.07.2014, 01:48:24

Sorry für Gramatik & Stilistik Fehler.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

14.07.2014, 07:15:07 via App

Kann ich schon verstehen die Strings mit IFs zuchuigehen ist einfacher.
Aber die gewünschte Methode funktioniert durchaus, ich kann ja auch darüber ein Variables intent generieren.
Also Java untersützt sowas durchaus.
Mann muss nur wissen wie man es anwenden muss.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

14.07.2014, 07:15:45 via App

Kann ich schon verstehen die Strings mit IFs zuchuigehen ist einfacher.
Aber die gewünschte Methode funktioniert durchaus, ich kann ja auch darüber ein Variables intent generieren.
Also Jqva untersützt sowas durchaus.
Mann muss nur wissen wie man es anwenden muss.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Andy N.
  • Forum-Beiträge: 3.112

14.07.2014, 18:23:08 via Website

Sind die Methoden statisch kann man sie ganz einfach über Reflection aufrufen.
Ansonsten muss man eben Commands schreiben und die Referenz im Array speichern.

Antworten
Georg C.
  • Forum-Beiträge: 235

15.07.2014, 01:28:38 via Website

Hallo,
normal, - bin raus - also "over" ... wollte mich nicht weiter "einmischen".
Nun:

Aber die gewünschte Methode funktioniert durchaus, ich kann ja auch
darüber ein Variables intent generieren. Also Jqva untersützt sowas
durchaus.

bzw. die Antwort vom Andy N. interpretiere ich als "Georg du erzählst quatsch".
Ich versuche sowas zwar zu vermeiden, aber habe keine Probleme damit, wenn ich wirklich quatsch schreibe / rede, dass mir jemand daran hindert. Gerade das ist gewünscht!
Mann lernt nie aus! ;)
...
Nun:
Abstrahierend davon, dass <> String[][] xxxx <> ein zweidimensionales ARRAY! vom Datentyp String ist,
....
ein String Objekt - z.B.:
String start = gofunktion [0][1]);
NUR!
aufgabe1()
ausgibt.
Also start = aufgabe1()
Das was.
-> und was weiter?

Deshalb betone ich noch mall, dass:
Aus einem String kann man KEINE! Methode ausführen / "starten" - FERTIG
Dem Fragesteller soll es bei seinen Versuchen, - also als Info / Tipp weiterhelfen.

WAS! bzw. WIE? - man die Arrayfelder im Code benutzen kann ist "was anderes".
Ich vermute deshalb, dass wir uns mit den Fakten irgendwie "gesplitet" haben.

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten