2016-06-18 5 views
0

Я хочу вызвать метод showMessage(), который определен в моей основной деятельности из класса TestButton, которые расширяют Button. Код, который я использую ниже, выдает исключение нулевого указателя. Я не уверен, как это решить. Не могли бы вы мне помочь?Как вызвать метод MainActivity классом, который расширяет Button

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

}

EDIT Спасибо @ ΦXoce 웃 Пepeúpa это решить мою проблему, но я сделал немного изменения.

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

и

public void setCallback(final ICallback iCallback) 
+0

Можете ли вы рассказать о том, как ваш код «не работает»? Что вы ожидали, и что на самом деле произошло? Если вы получили исключение/ошибку, опубликуйте строку, в которой она произошла, и сведения об исключении/ошибке. Пожалуйста, отредактируйте эти данные или мы не сможем помочь. –

+0

@ Исаак вам нужно изучить многие основные андроиды, прежде чем ставить здесь вопрос. Например, почему вы создаете объект Activity, который не разрешен в android. Почему вам нужно отвечать в классе обертки? – Neo

+0

Также вы можете исправить отступ вашего кода, добавив 4 пробела в каждую строку? Первая строка выглядит нормально, но остальное выглядит немного странно. –

ответ

0

2 вещи:

  1. м = новый MultitouchtestActivity(); это не способ, которым ANDROID хочет, чтобы вы создавали/создавали действия. Поэтому у вас больше шансов сломать ваш код, чем делать что-то прямо, вызвав непосредственно конструктор.
  2. С другой стороны, пытается вызвать метод из 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); 
} 
} 
Смежные вопросы