0

I am learning to make android applications and so kindly help me. I am making some application to learn touch inputs. So I decided to start with getting the touch location.

I made this application

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

}

When I use the emulator to run this app, it crashes. However a small change in the application (namely removing "final TextView textView = (TextView)findViewById(R.id.textView);" from the class and putting it as a part of function onTouch makes the app work)

Can someone explain why the first code does not work?

Thank you.

-- The correct code:

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が呼び出された後にのみ、findViewByIdを呼び出すことができます。 onTouchEventsetContentViewの後に呼び出されるため、機能します。

したがって、これは機能します:

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 に答える