2017-01-12 2 views
0

Dies kann eine wirklich dumme Frage oder nicht einmal möglich sein.Wie man Methoden als Parameter in Android übergibt

Ich bin nicht sicher, ob dies als eine Methode aufgerufen werden würde, aber damit fortfahren. Wie kann ich getCountryName() übergeben? als Parameter? wie unten gezeigt;

public static String Utils(Something something){ 
    Geocoder geoCoder = new Geocoder(context, Locale.getDefault()); 
    List<Address> address = null; 

    if (geoCoder != null) { 
     try { 
      address = geoCoder.getFromLocation(lat, lng, 1); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     if (address.size() > 0) { 
      return address.get(0).getCountryName(); // pass this as parameter (something) 
     } 
    } 
    return null; 
} 

und dann rufen wie so,

Utils(getCountryName()); 
Utils(getCountryCode()); 
etc. 
+0

Versuchen aufgerufen werden würde mit Ihnen kennen lernen. – Spartan

+0

Ich habe einige Dinge ausprobiert, aber es sind wirklich dumm wie (Method Name) aber sowieso diese haben nicht funktioniert – SumOne

+0

Sie können Methodenname übergeben, die etwas zurückgibt (String, Int usw.). Aber um die Funktion zu übergeben, müssen Sie funktionale Programmierfunktionen Lambda-Ausdrücke etc. – Spartan

Antwort

1

in Java, dass die Sprache ist, die Sie schließlich verwenden. Sie können eine Methode oder Funktion nicht als Parameter an eine Funktion übergeben. Wenn Sie in der Lage sind, es zu verwenden, haben Sie von Java 8 Lambda-Ausdrücke, die eine Art "anonyme" Funktion sind. Versuche es damit.

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

In dieser SO beantworten Sie eine sehr detaillierte Anleitung haben. Java Pass Method as Parameter

In diesem Thread gibt es weitere Informationen mit einigen Mustern, wenn Sie nicht java8

+0

Gibt es einen anderen Weg, dies zu erreichen. Ich möchte nur eine Methode aufrufen können, aber unterschiedliche Werte zurück erhalten. z.B. Postleitzahl, Ländername usw. – SumOne

+0

das ist eine andere Frage. Sie sollten für jeden Werttyp eine Methode implementieren. Vielleicht ist es nicht ein richtiger Entwurf mit einer Methode, deren Rückgabewerte manchmal eine Sache mit einer Signifiance ist und im nächsten Aufruf dieselbe Methode einen Wert zurückgibt, dessen Mittelwert ganz anders ist ... – acostela

0

Sie Reflektion verwenden können, verwenden können.

z.B.

Method[] methods = Address.class.getMethods(); 
for (Method method : methods){ 
    if(method.getName().equals(param)){ 
     return (String) method.invoke(address.get(0)); 
    } 
} 

param würde vom Typ sein String mit dem Wert der Methode, die Sie aufrufen möchten.

EDIT: Voll Beispiel getMethod(String)

public static String Utils(String param){ 
    Geocoder geoCoder = new Geocoder(context, Locale.getDefault()); 
    List<Address> address = null; 

    if (geoCoder != null) { 
     try { 
      address = geoCoder.getFromLocation(lat, lng, 1); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     if (address.size() > 0) { 
      Method method = Address.class.getMethod(param); 
      if(method == null) return null; 
      try{ 
       return (String) method.invoke(address.get(0)); 
      }catch(ReflectiveOperationException e){ 
       // Expected param maybe? 
       return null; 
      } 
     } 
    } 
    return null; 
} 
+0

tippe ich Method [] methods = Address.class .getMethods(); dies als Parameter? – SumOne

+0

Nein, Ihre Methodensignatur würde nun aussehen wie 'public static String Utils (String param)' – Ryan

+0

Ich bekomme einen Fehler dabei: method.invoke (address.get (0)); sprich unhandle exception java.lang.exception.illegalstateexception ... – SumOne

0

versuchen dies mit;

zunächst eine Schnittstelle mit der Methode, die Sie als Parameter

public interface Callable { 
    public void getCountryName(); 
    public void getCountryCode(); 
} 

Implementieren einer Klasse mit der Methode

class Method_passing implements Callable { 
    public void getCountryName() { 
    //do your task 
    } 

    public void getCountryCode() { 
    //do your task 
    } 
} 

Invoke wie die

Callable cmd = new Method_passing(); 
//This allows you to pass cmd as parameter and invoke the method call defined in the interface 

public invoke(Callable callable) { 
    cmd.getCountryName(); //return name etc.. 
    cmd.getCountryCode(); 
} 
0

Sie konnte übergeben werden soll definieren Implementieren Sie eine getUtil-Funktion innerhalb Ihrer Adressklasse und verwenden Sie dann Bezeichner, um eine Funktion auszuführen deine Entscheidung.

public class Address { 
public static final int GET_COUNTRY_NAME = 1; 
public static final int GET_COUNTRY_CODE = 2; 

public String getUtil(int code){ 
    switch(code){ 
    case GET_COUNTRY_NAME: return this.getCountryName(); 
    case GET_COUNTRY_CODE: return this.getCountryCode(); 
    default: return null; 
    } 
} 

private String getCountryName(){ 
    //do something 
    return ""; 
} 

private String getCountryCode(){ 
    //do something 
    return ""; 
}} 

und dann Funktion wie

public static String Utils(int something){ 
Geocoder geoCoder = new Geocoder(context, Locale.getDefault()); 
List<Address> address = null; 

if (geoCoder != null) { 
    try { 
     address = geoCoder.getFromLocation(lat, lng, 1); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
    if (address.size() > 0) { 
     return address.get(0).getUtil(something); 
    } 
} 
return null; }} 

definieren, die es

Utils(Address.GET_COUNTRY_NAME); 
Utils(Address.GET_COUNTRY_CODE); 
Verwandte Themen