106

Java 以外、Android 以外の分野での経験が豊富で、Android を学んでいます。

私はさまざまな分野で多くの混乱を抱えています。そのうちの 1 つは、ボタンのクリックを処理する方法です。それを行うには少なくとも 4 つの方法があります (!!!)。ここに簡単にリストします。

一貫性を保つために、それらをリストします。

  1. View.OnClickListenerアクティビティにクラスのメンバーを配置し、アクティビティ メソッドonClickでロジックを処理するインスタンスに割り当てます。onCreate

  2. 「onCreate」アクティビティ メソッドで「onClickListener」を作成し、setOnClickListener を使用してボタンに割り当てます。

  3. アクティビティ自体に「onClickListener」を実装し、ボタンのリスナーとして「this」を割り当てます。アクティビティにボタンがほとんどない場合、ボタン ID を分析して、適切なボタンの「onClick」ハンドラーを実行する必要があります。

  4. 「onClick」ロジックを実装するアクティビティにパブリック メソッドを用意し、それをアクティビティ xml 宣言のボタンに割り当てます。

質問1:

これらはすべての方法ですか、他のオプションはありますか? (私は他に何も必要としません、ただ興味があります)

私にとって、最も直感的な方法は最新の方法です。入力するコードの量が最小限で済み、(少なくとも私にとっては) 最も読みやすい方法です。

ただし、このアプローチが広く使用されているとは思いません。それを使用することの短所は何ですか?

質問2:

これらの各方法の長所と短所は何ですか? あなたの経験または良いリンクを共有してください。

どんなフィードバックでも大歓迎です!

PS Google でこのトピックの何かを見つけようとしましたが、見つけたのはそれを行うための「方法」の説明だけであり、なぜそれが良いか悪いかではありません。

4

10 に答える 10

158

質問 1: 残念ながら、あなたが最も直感的だとおっしゃるアプリは、Android で最も使用されていないアプリです。私が理解しているように、UI (XML) と計算機能 (Java クラス ファイル) を分離する必要があります。また、デバッグも容易になります。実際、このように読み、Android imo について考える方がはるかに簡単です。

質問 2: 主に使用されるのは #2 と #3 の 2 つだと思います。例として Button clickButton を使用します。

2

匿名クラスの形式です。

Button clickButton = (Button) findViewById(R.id.clickButton);
clickButton.setOnClickListener( new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                ***Do what you want with the click here***
            }
        });

これは、ボタン変数が findViewById で設定された場所のすぐ隣に onClick メソッドがあるため、私のお気に入りです。この clickButton ボタン ビューを処理するすべてのものがここに配置されていることは、非常にきちんと整理されているように見えます。

私の同僚がコメントしている短所は、onclickリスナーを必要とする多くのビューがあると想像することです。onCreate の長さが非常に長くなることがわかります。そのため、彼が使用するのが好きな理由:

3

5 つの clickButtons があるとします。

アクティビティ/フラグメントが OnClickListener を実装していることを確認してください

// in OnCreate

Button mClickButton1 = (Button)findViewById(R.id.clickButton1);
mClickButton1.setOnClickListener(this);
Button mClickButton2 = (Button)findViewById(R.id.clickButton2);
mClickButton2.setOnClickListener(this);
Button mClickButton3 = (Button)findViewById(R.id.clickButton3);
mClickButton3.setOnClickListener(this);
Button mClickButton4 = (Button)findViewById(R.id.clickButton4);
mClickButton4.setOnClickListener(this);
Button mClickButton5 = (Button)findViewById(R.id.clickButton5);
mClickButton5.setOnClickListener(this);


// somewhere else in your code

public void onClick(View v) {
    switch (v.getId()) {
        case  R.id.clickButton1: {
            // do something for button 1 click
            break;
        }

        case R.id.clickButton2: {
            // do something for button 2 click
            break;
        }

        //.... etc
    }
}

すべての onClick 計算が 1 か所で処理され、onCreate メソッドが混雑していないため、私の同僚が説明しているように、この方法は彼の目にはすっきりしています。しかし、私が見る欠点は、次のことです。

  1. 自分自身を見て、
  2. onClick メソッドで使用される onCreate に配置される可能性のあるその他のオブジェクトは、フィールドにする必要があります。

さらに詳しい情報が必要な場合はお知らせください。かなり長い質問なので、完全には答えませんでした。そして、いくつかのサイトを見つけたら、答えを拡大します。今は、経験を積んでいるだけです。

于 2013-02-08T23:44:24.157 に答える
11

#1生成されていない(しかし明らかに静的な)ボタンがレイアウト上にある場合、最後のものを頻繁に使用します。

実際にビジネス アプリケーションで使用する場合は、特に注意してください。ProGuard などのソース難読化ツールを使用する場合は、アクティビティでこれらのメソッドを難読化しないようにマークする必要があるためです。

このアプローチである種のコンパイル時セキュリティをアーカイブするには、Android Lint ( example ) をご覧ください。


#2すべての方法の長所と短所はほぼ同じであり、レッスンは次のようになります。

これまでで最も適切なもの、または最も直感的に感じられるものを使用してください。

同じものを複数のボタン インスタンスに割り当てる必要がある場合OnClickListenerは、クラス スコープに保存します (#1)。ボタンの単純なリスナーが必要な場合は、匿名の実装を作成します。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Take action.
    }
});

私はアクティビティに を実装しない傾向がありますOnClickListener。これは時々少し混乱します (特に、他の複数のイベント ハンドラーを実装していて、すべてが何をしているのか誰も知らない場合this)。

于 2013-02-08T23:29:34.610 に答える
8

私はオプション 4 を好みますが、Grails、Groovy、および JavaFX であまりにも多くの作業を行っているため、直感的に理解できます。ビューとコントローラーの間の「魔法の」接続はすべて共通です。メソッドに適切な名前を付けることが重要です。

ビューで、onClick メソッドをボタンまたは他のウィジェットに追加します。

    android:clickable="true"
    android:onClick="onButtonClickCancel"

次に、クラスでメソッドを処理します。

public void onButtonClickCancel(View view) {
    Toast.makeText(this, "Cancel pressed", Toast.LENGTH_LONG).show();
}

繰り返しますが、メソッドに明確な名前を付けてください。とにかくやるべきことであり、メンテナンスは第二の性質になります。

大きな利点の 1 つは、メソッドの単体テストをすぐに記述できることです。オプション 1 はこれを行うことができますが、2 と 3 はより困難です。

于 2015-12-19T17:44:32.453 に答える
4

最もよく使用される方法は、匿名宣言です

    Button send = (Button) findViewById(R.id.buttonSend);
    send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // handle click
        }
    });

また、View.OnClickListener オブジェクトを作成して後でボタンに設定することもできますが、たとえば onClick メソッドをオーバーライドする必要があります。

View.OnClickListener listener = new View.OnClickListener(){
     @Override
        public void onClick(View v) {
            // handle click
        }
}   
Button send = (Button) findViewById(R.id.buttonSend);
send.setOnClickListener(listener);

アクティビティが OnClickListener インターフェイスを実装する場合、アクティビティ レベルで onClick(View v) メソッドをオーバーライドする必要があります。次に、このアクティビティをボタンのリスナーとして割り当てることができます。これは、既にインターフェイスを実装しており、onClick() メソッドをオーバーライドしているためです。

public class MyActivity extends Activity implements View.OnClickListener{


    @Override
    public void onClick(View v) {
        // handle click
    }


    @Override
    public void onCreate(Bundle b) {
        Button send = (Button) findViewById(R.id.buttonSend);
        send.setOnClickListener(this);
    }

}

(私見)複数のボタンに同じハンドラーがあり、アクティビティクラスで1つのメソッドを宣言し、このメソッドをxmlレイアウトの複数のボタンに割り当てることができる場合に使用される4番目のアプローチ、また、1つのボタンに対して1つのメソッドを作成できますが、この場合は私アクティビティ クラス内でハンドラーを宣言することを好みます。

于 2013-02-08T23:32:27.897 に答える
2

質問2で述べたように物事を簡単にするために、このようなラムダメソッドを利用して変数メモリを節約し、ビュークラスで上下に移動するのを避けることができます

//method 1
findViewById(R.id.buttonSend).setOnClickListener(v -> {
          // handle click
});

ただし、メソッドで一度にクリックイベントをボタンに適用したい場合。

@D の質問 3 を利用できます。トラン回答。ただし、ビュー クラスを で実装することを忘れないでくださいView.OnClickListener

質問#3を適切に使用するには

于 2018-05-08T10:18:41.610 に答える
1

オプション 1 と 2 では、コードが煩雑になる内部クラスを使用します。オプション 2 は、ボタンごとに 1 つのリスナーが存在するため、やや面倒です。ボタンの数が少ない場合は、これで問題ありません。オプション 4 の場合、xml および Java コードに戻って 4 番目に戻る必要があるため、デバッグが難しくなると思います。複数のボタンクリックを処理する必要がある場合、私は個人的にオプション 3 を使用します。

于 2013-02-08T23:29:37.317 に答える
0

ステップ 1: XML ファイルを作成します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnClickEvent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me" />
</LinearLayout>

ステップ 2: MainActivity を作成します。

package com.scancode.acutesoft.telephonymanagerapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

    Button btnClickEvent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnClickEvent = (Button) findViewById(R.id.btnClickEvent);
        btnClickEvent.setOnClickListener(MainActivity.this);

    }

    @Override
    public void onClick(View v) {
        //Your Logic
    }
}

ハッピーコーディング!

于 2016-04-18T10:44:36.947 に答える
0

質問 1 - ビューのクリックを処理する唯一の方法です。

質問#2 -
オプション#1/オプション#4 - オプション#1 とオプション#4 に大きな違いはありません。私が見る唯一の違いは、アクティビティが OnClickListener を実装している場合と、匿名の実装がある場合です。

オプション #2 - このメソッドでは、匿名クラスが生成されます。複数のボタンがある場合は、複数回実行する必要があるため、この方法は少し面倒です。匿名クラスの場合、メモリ リークの処理に注意する必要があります。

オプション #3 - ただし、これは簡単な方法です。通常、プログラマーはメソッドを作成するまではメソッドを使用しないように努めるため、このメソッドは広く使用されていません。ほとんどの人が Option#4 を使用していることがわかります。コードの面でよりクリーンだからです。

于 2013-02-08T23:29:24.227 に答える