Android应用程序崩溃 - 我在哪里创建对象是原因

时间:2013-03-11 05:01:15

标签: java android touch

我正在学习制作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;
    }

}

4 个答案:

答案 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()时,您在稍后设置此活动的视图,同时在类加载时访问它。