2016-08-28 22 views
0

MainActivity.java:findViewByIdがnullの場合、正しく表示されません。

public class MainActivity extends AppCompatActivity { 
    protected void onCreate(Bundle savedInstanceState) { 
     setContentView(R.layout.activity_main); 
    } 
    public void OnClickSendButton(View view) { 
     EditText editTxt = (EditText) view.findViewById(R.id.MessageEditText); 
     CharSequence toastText = editTxt.getText().toString(); 
    } 
} 

activity_main.xml:

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.example.faridahamat.androidlayout.MainActivity"> 

    <EditText 
     android:id="@+id/MessageEditText"/> 
    <Button 
     android:onClick="OnClickSendButton"/> 
<GridLayout/> 

私はすでにactivity_main.xmlを使用するようsetContentViewと呼ばれ、なぜ私はMessageEditTextのコンテンツを取得することはまだできていないのですか? MainActivityが既にレイアウトとしてactivity_main.xmlを使用している場合、内部にあるビューを呼び出すことでそのレイアウト内にあるものを取得できないはずですか?

私は初心者ですので、Activity/Viewの私の理解が間違っているかもしれないので、説明してください。

+0

'view.findViewById'はクリックしたビューを検索します。単純に 'findViewById'はコンテンツビューです –

+0

' super.onCreate(savedInstanceState);を呼び出さないのはなぜですか? –

+0

@SantiagoHernández私はここに書き込む前に不要なコードを削除しました:) – Farid

答えて

2

ないで、R.layout.activity_mainR.id.MessageEditTextを探す必要があり、それをボタンを使用し、あなたはそうではありません。 onClickに返されたビューは、ルートビューではなくクリックされたビューです。

を使用すると、onCreateに必要なすべてのビューが表示されるため、通常、複雑な階層のN回の繰り返しを繰り返す必要はありません。

+0

以下のcricket_007の回答が、コードを介して間違っている理由を示していましたが、これを正解としました。ありがとうございました – Farid

1

変更

EditText editTxt = (EditText) view.findViewById(R.id.MessageEditText); 

EditText editTxt = (EditText) findViewById(R.id.MessageEditText); 

Viewあなたがいないボタン

0

良い練習これはあなたの問題を解決しますonCreate

にビューの参照を取得することです:

public class MainActivity extends AppCompatActivity { 

    private EditText mMessageEditText; 
    private Button mButtonView; 

    protected void onCreate(Bundle savedInstanceState) { 
     setContentView(R.layout.activity_main); 
     mMessageEditText = findViewById(R.id.MessageEditText); 
     // you did not set an id to the button view 
     // mButtonView = findViewById(BUTTON_VIEW_ID); 
    } 
    public void OnClickSendButton(View view) { 
     CharSequence toastText = mMessageEditText.getText().toString(); 
    } 
} 
1

機能onClickSendViewは、そのボタンのビューではなく、図、 Activityに使用しているレイアウトのしたがって実際にはが正しいとは思わないButtonビュー内にあることを確認しようとしています。

だからfindViewByIdは次のようになります。

EditText editTxt = (EditText) findViewById(R.id.MessageEditText); 

そのあなたがそれらを使用したいところはどこでも、後でそれらを使用するonCreate関数内のすべてのビューの参照を取得することをお勧め。あなたのonCreate機能でsetContentViewに電話した後、@AugustoCarmoさんのように、すべてのビューの参照を取得するように言った。

レイアウトの参照IDを適切に設定することです。 EditTextのIDはR.id.MessageEditTextではなくR.id.message_edit_textのようになります。これは、レイアウト参照ID命名のための従来の方法です。

+0

私はC#の背景から来て、従来の命名は習慣です...:P – Farid

関連する問題