我一直在为 Android 开发一个简单的触摸处理程序,它可以触发诸如 onUpdate(触摸屏幕时)之类的回调,而无需设置线程。我的问题是我对 Java 的了解相当有限,我做不到,因为我对如何使用接口知之甚少。我很确定我的问题可能是一个简单的错字之类的,但是当我从触摸处理程序(处理触摸信息)执行方法时,我得到了 NullPointerException,这样我就可以在主活动类中做我需要的事情.
这是主要的类代码(从不相关的东西中删除):
//package and imports
public class Test extends Activity implements TouchHelper {
StringBuilder builder = new StringBuilder();
TextView textView;
TouchReader touchReader;
List<TouchTable> touchTablesArray;
TouchTable touchTable;
public static final String Tag = "TouchTest";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
textView = new TextView(this);
Log.d(Tag, "TextView initialized " + textView);
textView.setText("Touch and drag (multiple fingers supported)!");
touchReader = new TouchReader(textView);
Log.d(Tag, "touchReader initialized");
touchTablesArray = touchReader.getTouchTables();
setContentView(textView);
}
@Override
public void onTouchUpdate(int pointerId)
{
Log.d(Tag, "onTouchUpdate called");
touchTable = touchTablesArray.get(pointerId);
Log.d(Tag, "touchTable get successful");
//writing on stringbuilder
}
}
这是处理程序本身的代码:
//package and imports
public class TouchReader implements OnTouchListener
{
public final static String Tag = "TouchReader";
List<TouchTable> touchTables;
TouchHelper helper;
TouchTable touchTable = new TouchTable();
public TouchReader(View view)
{
view.setOnTouchListener(this);
touchTables = new ArrayList<TouchTable>(10);
Log.d(Tag, "TouchReader initialized");
}
public boolean onTouch(View v, MotionEvent event)
{
synchronized(this)
{
//all the common code handling the actual handling, with switches and such
touchTables.add(pointerId, touchTable); //obviously the pointerId is defined earlier
Log.d(Tag, "Values updated");
helper.onTouchUpdate(pointerId); //the exception is here
Log.d(Tag, "Update called");
}
return true;
}
public List<TouchTable> getTouchTables()
{
synchronized(this)
{
return touchTables;
}
}
}
如您所见,该错误很可能是由于我无法正确使用界面,但所有官方文档都让我更加困惑。
最后是界面的小代码:
//package
public interface TouchHelper
{
public void onTouchUpdate(int pointerId);
}
我希望这个问题不会太无聊,不能在这里发布:)
编辑:感谢大家的帮助,最后我遵循了 Bughi 的解决方案。