2017-07-12 8 views
-1

"NumbersClickListners"行の上に "setContentView"を配置すると、アプリケーションは期待どおりに動作します。setContentViewの位置を変更すると、アプリの動作が変更されるのはなぜですか?

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     NumbersClickListners numbersClickListners = new NumbersClickListners(); 
     TextView numbers = (TextView) findViewById(R.id.numbers); 
     numbers.setOnClickListener(numbersClickListners); 

    } 

しかし、すぐに「setContentViewは」「NumbersClickListners」アプリのクラッシュで始まる3行の下に配置されます。コードは次のようになります

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     NumbersClickListners numbersClickListners = new NumbersClickListners(); 
     TextView numbers = (TextView) findViewById(R.id.numbers); 
     numbers.setOnClickListener(numbersClickListners); 


     setContentView(R.layout.activity_main); 

    } 

この動作の理由はほとんどわかりません。誰でも助けてくれますか?

+1

setContentViewは私がuはちょうど説明したものを思い出したときに私が間違っている場合、ビュー – tyczj

+0

は私を修正@tyczj膨張させるものですので。コンパイラは、上記の行がスキップされているため、インフレータであるためsetContentViewからコードを読み込み始めます。 –

+0

あなたは何を言っているのか分かりません。コードはスキップされません。 – tyczj

答えて

0

レイアウトの寿命を見てみましょう。

まず第一に、あなたは、ユーザーフレンドリーな方法であなたの設計を行い、ニーズに応じて要素に名前を付けるXMLファイルを、宣言することによって、それを作成する必要があります。 あなたのレイアウトは単なるファイルであり、Androidはパフォーマンス上の理由から本当に気にしません。

次は、あなたのレイアウトを使用することです。これを行うには、ViewGroupおよびViewsと呼ばれるオブジェクトの内部構造にファイルを変換する必要があります。 このプロセスをinflatingと呼びます。これは、findViewById()を呼び出すことによって、システムがビューを見つけることができるポイントです。

だから、第二のスニペットでは、あなたはあなたに膨張していないボタンを、見つけるために、活動をお願いします。それは例外を投げることにつながります。あなたがのonCreateでやりたい

一般的に言って、最初はsetContentView()を呼び出すことです。

関連する問題