2016-06-18 7 views
0

Ich möchte eine Methode aufrufen, die in meiner Hauptaktivität aus einer TestButton-Klasse, die Button erweitern, definiert ist. Der Code, den ich verwende, löst eine Nullzeiger-Ausnahme aus. Ich bin mir nicht sicher, wie ich das lösen soll. Kannst du mir bitte helfen?So rufen Sie eine Methode von MainActivity durch eine Klasse, die Schaltfläche erweitert

MainActivity

public class MainActivity extends MultiTouchActivity { 

TestButton btn; 
@Override 
public void onCreate(final Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    btn = (TestButton)findViewById(R.id.button4); 
    btn.setOnTouchListener(this); 
} 
public void showMessage() 
{ 
    Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show(); 
} 

TestButton Klasse

public class TestButton extends Button { 

MainActivity m; 
public TestButton(final Context context, final AttributeSet attrs) 
{ 
    super(context, attrs); 

    // TODO Auto-generated constructor stub 
} 

@Override 
public boolean onTouchEvent(final MotionEvent event) 
{ 
    if (event.getAction() == MotionEvent.ACTION_UP) 
    { 
     m = new MultitouchtestActivity(); 
     m.showMessage(); 
    } 
    return super.onTouchEvent(event); 
} 

}

EDIT Danke @ ΦXoce 웃 Пepeúpa das ist mein Problem zu lösen, aber ich habe ein wenig Änderungen.

btn.setCallback(this); from btn.setCallback(); 

und

public void setCallback(final ICallback iCallback) 
+0

Können Sie näher erläutern, wie Ihr Code "nicht funktioniert"? Was hast du erwartet und was ist eigentlich passiert? Wenn Sie eine Ausnahme/einen Fehler erhalten haben, geben Sie die Zeile, auf der sie aufgetreten ist, und die Ausnahme-/Fehlerdetails an. Bitte [bearbeiten] Sie diese Details oder wir können Ihnen möglicherweise nicht weiterhelfen. –

+0

@Isaac Sie müssen viele grundlegende Android lernen, bevor Sie hier eine Frage stellen. Wie Warum erstellen Sie ein Objekt der Aktivität, die in Android nicht erlaubt ist. Warum müssen Sie innerhalb einer Wrapper-Klasse antworten? – Neo

+0

Könnten Sie auch den Einzug Ihres Codes korrigieren, indem Sie jeder Zeile 4 Leerzeichen hinzufügen? Die erste Zeile erscheint in Ordnung, aber der Rest sieht ein bisschen komisch aus. –

Antwort

0

2 Dinge:

  1. m = new MultitouchtestActivity(); ist nicht die Art und Weise, wie ANDROID möchte, dass Sie Aktivitäten erstellen/instanziieren. So haben Sie mehr Chancen, Ihren Code zu brechen, als etwas richtig zu machen, indem Sie den Konstruktor direkt aufrufen.
  2. Auf der anderen Seite versuchen, eine Methode von der Aktivität innerhalb aufzurufen einer Taste braucht Kreis-Abhängigkeiten machen Sie Klasse ... jetzt Ihre Aktivität ein Aktivitätsobjekt zwingt .. (kein guter Ansatz)

Wie es lösen

eine Schaltfläche Objekt und Ihre Schaltfläche muss

Implementieren Sie einen Rückruf wie folgt:

interface ICallback{ 
    void showMessage(); 
} 

public class MainActivity extends MultiTouchActivity implements ICallback{ 

TestButton btn; 

@Override 
public void onCreate(final Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    btn = (TestButton)findViewById(R.id.button4); 
    btn.setOnTouchListener(this); 
    //register here the callback 
    btn.setCallback(this); 
} 

@Override 
public void showMessage() 
{ 
    Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show(); 
} 

public class TestButton extends Button { 

MainActivity m; 
ICallback iCallback; 
public setCallback(final ICallback iCallback) 
{ 
    this.iCallback = iCallback; 
} 
public TestButton(final Context context, final AttributeSet attrs) 
{ 
    super(context, attrs); 

    // TODO Auto-generated constructor stub 
} 

@Override 
public boolean onTouchEvent(final MotionEvent event) 
{ 
    if (event.getAction() == MotionEvent.ACTION_UP) 
    { 
     iCallback.showMessage(); 
    } 
    return super.onTouchEvent(event); 
} 
} 
Verwandte Themen