我正在学习制作Android应用程序,所以请帮助我。 我正在做一些学习触摸输入的应用程序。 所以我决定从获取触摸位置开始。
我做了这个应用程序
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "in.manas.anurag.firstapp.MESSAGE";
final TextView textView = (TextView)findViewById(R.id.textView);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View touchView = findViewById(R.id.touchView);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
textView.setText("Touch coordinates : " +
String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
当我使用模拟器运行此应用程序时,它会崩溃。 然而,应用程序中的一个小变化(即从类中删除“最终TextView textView =(TextView)findViewById(R.id.textView);”并将其作为函数onTouch的一部分,使应用程序工作)
有人可以解释为什么第一个代码不起作用吗?
谢谢。
- 正确的代码:
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "in.manas.anurag.firstapp.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View touchView = findViewById(R.id.touchView);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final TextView textView = (TextView)findViewById(R.id.textView);
textView.setText("Touch coordinates : " +
String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
答案 0 :(得分:1)
下面的代码可以使用
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "in.manas.anurag.firstapp.MESSAGE";
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View touchView = findViewById(R.id.touchView);
textView = (TextView)findViewById(R.id.textView);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
textView.setText("Touch coordinates : " +
String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
您的代码未运行的答案是您尝试实例化视图
final TextView textView = (TextView)findViewById(R.id.textView);
在setContentView(R.layout.activity_main);
之前
在使用view id
之前,我们必须告诉它应该从哪个layout
实例化视图。
答案 1 :(得分:1)
在第一个代码中,您将 findViewById 放在类的全局变量中。 但是,只有在调用 setViewContent 后才能调用 findViewById 。 在 setContentView 之后调用 onTouchEvent ,因此它可以正常工作。
所以这会奏效:
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "in.manas.anurag.firstapp.MESSAGE";
final TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// this is the place for calling findViewById
textView = (TextView)findViewById(R.id.textView);
final View touchView = findViewById(R.id.touchView);
}
答案 2 :(得分:0)
如果您希望能够在任何地方使用TextView
,则可以执行此操作。
public final static String EXTRA_MESSAGE = "in.manas.anurag.firstapp.MESSAGE";
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View touchView = findViewById(R.id.touchView);
textView = (TextView)findViewById(R.id.textView); // after the setContentView
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// set the co-ordinates to the textView.
textView.setText("Touch coordinates : " +
String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
return true;
}
答案 3 :(得分:0)
早期崩溃的原因是您在加载类时尝试访问视图(findViewById)。稍后调用setContentView()时,视图对象将可用。在调用onCreate()时,您在稍后设置此活动的视图,同时在类加载时访问它。