[解決済み] Android onClick in XML vs. OnClickListener
2023-02-27 21:34:06
質問
以前にも同じような質問があったようですが、今回は別件です。私はアンドロイドアプリの開発でかなり新しいです。
android:onclick=""
XML属性と
setOnClickListener
メソッドを使用します。
-
この2つの違いは何ですか?2つの実装の違いは、コンパイル時、実行時、あるいはその両方で見つかるのでしょうか?
-
どのようなユースケースがどちらの実装に有利なのでしょうか?
-
Androidでフラグメントを使用することで、実装の選択にどのような違いがあるのでしょうか?
どのように解決するのですか?
OnClickListenerとOnClickの違い。
- OnClickListenerは実装が必要なインターフェースで、Javaのコードでビューに設定することができます。 をJavaコードで設定することができます。
- OnClickListenerは、誰かが実際にクリックするのを待つものです。 クリックされたときに何が起こるかを決定します。 クリックされたときに何が起こるかを決定します。
- 最近、androidはandroid:onclickと呼ばれるxml属性をビューに追加しました。 これは、ビューのアクティビティで直接クリックを処理するために使用することができます。 インターフェイスを実装することなく、ビューのアクティビティで直接クリックを処理するために使用することができます。
- 必要であれば、リスナーの実装を別のものと簡単に交換することができます。
- OnClickListener は、クリックイベントのアクション/ビヘイビアを、イベントをトリガーするビューから分離することを可能にします。単純なケースでは、これはそれほど大きな問題ではありませんが、複雑なイベント処理のために、これはコードのより良い読みやすさと保守性を意味するかもしれません。
- OnClickListener はインターフェースなので、これを実装するクラスは、イベントを処理するために必要なインスタンス変数とメソッドを決定する際に柔軟性を持ちます。繰り返しになりますが、これは単純なケースでは大きな問題ではありませんが、複雑なケースでは、イベント処理に関連する変数/メソッドをイベントをトリガーするViewのコードと必要以上に混在させたくはないのです。
- XMLレイアウトの関数バインディングを持つonClickは、onClickとそれが呼び出される関数の間のバインディングです。関数は、onClick が機能するために、1 つの引数 (View)を持つ必要があります。
どちらも同じように機能しますが、一方はJavaコードで設定され、もう一方はXMLコードで設定されます。
setOnClickListenerのコード実装です。
Button btn = (Button) findViewById(R.id.mybutton);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myFancyMethod(v);
}
});
// some more code
public void myFancyMethod(View v) {
// does something very interesting
}
XMLの実装です。
<?xml version="1.0" encoding="utf-8"?>
<!-- layout elements -->
<Button android:id="@+id/mybutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me!"
android:onClick="myFancyMethod" />
<!-- even more layout elements -->
性能です。
性能はどちらも同じです。Xmlはコンパイル時にバイナリコードに事前パースされるので、Xmlにはオーバーヘッドがありません。
制限事項。
android:onClickはAPIレベル4以降用なので、< 1.6を対象にしている場合は使えません。
関連
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み] AsyncTaskを複数回実行する
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] AndroidでTextViewの下にアンダーラインを引くには
-
[解決済み] Google Play ストア内部テストのロールアウトが開始できない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ArrayAdapter<myClass> の使用方法
-
[解決済み] Android Studio - あいまいなメソッド呼び出し getClass()
-
[解決済み] EclipseのAndroidプロジェクトにライブラリ/JARを追加する
-
[解決済み] Gradleでビルドタイプを使用し、ContentProviderを使用する同じアプリを1つのデバイスで実行する。
-
[解決済み] グリッドビューの高さが削減される
-
[解決済み] PendingIntentの "requestCode "は何に使うのですか?
-
[解決済み] BottomNavigationViewを新しいNavControllerで使用する際に、フラグメントを生かす方法はありますか?
-
[解決済み] google-services.jsonって実際何してるの?
-
[解決済み] ブルートゥースアプリケーションのテストにアンドロイドエミュレータを使用するには?
-
[解決済み] 文字列リソースにHTML?