0

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

}

当我使用模拟器运行这个应用程序时,它崩溃了。然而,应用程序中的一个小变化(即从类中删除“final 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

4 回答 4

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它应该从哪个实例化视图。

于 2013-03-11T05:09:42.337 回答
1

在第一个代码中,您将findViewById放在类的全局变量中。但是只有在调用setViewContent之后才能调用findViewByIdonTouchEvent在setContentView之后被调用,所以它可以工作。

所以这会起作用:

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);
}
于 2013-03-11T05:11:41.487 回答
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;
}
于 2013-03-11T05:09:04.817 回答
0

早期崩溃的原因是您在加载类时尝试访问视图 (findViewById)。当您调用 setContentView() 时,视图对象将在稍后可用 您在调用 onCreate() 时为该活动设置视图很晚,同时在类加载时访问它。

于 2013-03-11T05:14:59.520 回答