【问题标题】:How to call a method of MainActivity by a class that extends Button如何通过扩展 Button 的类调用 MainActivity 的方法
【发布时间】:2016-06-18 20:51:58
【问题描述】:

我想从扩展 Button 的 TestButton 类调用在我的主要活动中定义的方法 showMessage()。我在下面使用的代码会引发空指针异常。我不知道如何解决这个问题。你能帮帮我吗?

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 类

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);
}

}

编辑 谢谢@ΦXoce 웃 Пepeúpa 这解决了我的问题,但我做了一些改变。

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

public void setCallback(final ICallback iCallback)

【问题讨论】:

  • 您能否详细说明您的代码“不起作用”的原因?你期待什么,实际发生了什么?如果您遇到异常/错误,请发布它发生的行和异常/错误详细信息。请edit这些详细信息,否则我们可能无法提供帮助。
  • @Isaac 在提出问题之前,您需要学习许多基本的 android。就像为什么要创建 Activity 对象一样,这在 android 中是不允许的。为什么需要在包装类中响应?
  • 另外,您能否通过在每行添加 4 个空格来修复代码的缩进?第一行看起来不错,但其余的看起来有点奇怪。

标签: java android class methods


【解决方案1】:

两件事:

  1. m = new MultitouchtestActivity();不是ANDROID希望您创建/实例化活动的方式..因此,与直接调用构造函数做正确的事情相比,您有更多机会破坏代码..
  2. 另一方面,试图从按钮类内部的 Activity 调用方法会迫使您建立循环依赖关系...现在您的 Activity 需要一个按钮对象,而您的按钮需要一个 Activity 对象..(不是好方法)

如何解决

像这样实现回调:

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);
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2020-03-22
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多