2016-11-07 8 views
0

この質問はAndroid開発についてです。一般に、レイアウトXMLファイルを特定のアクティビティJavaファイルにどのように結び付けますか?これは、android:onClick属性が指定されたボタンなどの場合に関係します。あなたは次のようなボタンでレイアウトXMLファイルがあるとします。このボタンをクリックすると、アンドロイド:アンドロイドでフルメソッドパスを指定:onClick

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/button_send" 
    android:onClick="sendMessage" /> 

ので、sendMessage(View view)メソッドが呼び出されます。複数のアクティビティにsendMessage(View view)メソッドがある場合、Androidはどのメソッドを呼び出すかをどのように決定しますか?文字通り、レイアウトファイルとアクティビティファイルを関連付けることは絶対にありません。 Android Studioでは、複数の選択肢がある場合は、android:onClick="sendMessage"がメインアクティビティのsendMessageメソッドにデフォルト設定されています。また、Android Studioでは、完全なメソッドパス(例:android:onClick="com.example.Activity2.sendMessage")を指定することはできません。何か不足していますか?

編集:私は、Android Studioが

+0

あなたのonCreateアクティビティメソッドにsetContentView(int layoutId)を呼び出すため、Androidはどのメソッドを呼び出すかを決定します。 –

+0

"実際にはレイアウトファイルをアクティビティファイルに関連付けることは全くありません" - setContentView()は少なくとも2008年以降に存在し、文書化されています。 – CommonsWare

+0

しかし、 'android:onClick =" sendMessage "に' sendMessage'と入力すると、Android Studioは "com.example.MyApp.MainActivity"を示す小さいポップアップを表示します。アクティビティがコンテンツビューとして特定のレイアウトを設定しているかどうか – CircuitScholar

答えて

1

Activity上のメソッドを呼び出しますのsendMessageにかかわらず、特定の活動をデフォルトその活動は、setContentView()を経由してレイアウトを指定している示していることを追加したいと思いますあなたのレイアウトは膨らんでおり、添付されています。レイアウトとコントローラの間に緊密な結合がなければならないため、「フルパス」を指定できない理由があります。

私はxml属性の代わりにプログラムOnClickListenerを使用することをお勧めします。それはあなたにもっと大きなコントロールを与えます。

+0

あなたはタイトなカップリングが必要ないと言っています...なぜアンドロイド:onClick = "......" 'と入力すると、完全なメソッドパスを表示する小さなポップアップがAndroid Studioに表示されるのですか? Androidスタジオは超簡単なコードエディタになるために不正確な情報を単に表示していると思うようになっているので、主に欲求不満から尋ねます。 – CircuitScholar

+0

これはどのように不正確な情報ですか? layout onClickタグへのメソッドの結合ではなく、単なるベストプラクティスです。 –

+0

ここで言われたことによると、レイアウトはデフォルトで特定のアクティビティに結びついていないため、不正確です。それは、Activityがそれに対してsetContentViewを呼び出すすべてのものにバインドされます。だからAndroid Studioはちょっとしたポップアップ( 'com.whatever.AppName。ActivityName')は、レイアウトXMLファイル内にメソッド名をタイプしているので、必ずしもそのメソッドが呼び出されるActivityではないからです。 – CircuitScholar

0

もちろん、そのビューのアクティビティクラスからメソッドを呼び出します。したがって、主アクティビティクラスからのビューであればメインアクティビティクラスから呼び出され、アクティビティ2などからのビューの場合は、アクティビティ2のsendMessageメソッドが検索されます。 Activity2クラスでsendMessageメソッドを見つけられなかった場合、NullpointerExceptionがスローされます。

1

tools:contextという属性があり、レイアウトをどのようなコンテキストで使用するかをAndroidスタジオに伝えることができます。クラスを指定してから、このクラスを使用して正しいメソッドを見つけます。

ただし、この属性はIDE専用です。実行時には、レイアウトを膨らませたアクティビティのメソッドにバインドされます。

+0

はい、これも私が考えていたことですが、ツール:context属性が問題に影響しないことが判明しました(Androidスタジオは依然として主アクティビティのメソッド実装のデフォルト設定を主張しています。ツール:コンテキスト) – CircuitScholar

+0

これは変です。私にはAndroid Studioのバグのように聞こえる。このような種類のバインディングを行うためにAndroidAnnotations @Click注釈を使用しているので、私は長い間thie onClick属性を使用していませんでした。 – Dodge

+0

私はみんなの答えとコメントを見ただけでバグかもしれないことに同意します。私は肥大したコードエディタを嫌っているので、私は自分のコードを書いてAndroid Studioのハーフベークドフリルを無視しようとしています。 – CircuitScholar

関連する問題