1. ホーム
  2. java

[解決済み] Android:ボタンクリックの処理方法

2022-03-09 22:45:39

質問

JavaやAndroid以外の分野での経験があり、Androidを勉強中です。

いろいろなところで戸惑うことが多いのですが、その一つがボタンのクリックをどう処理するかということです。少なくとも4つの方法(!!)があり、それらは簡単にリストアップされています。 ここで

一貫性を保つために、それらを列挙します。

  1. のメンバーを持っていること。 View.OnClickListener を処理するインスタンスに割り当ててください。 onClick のロジックは onCreate アクティビティメソッド

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

  3. アクティビティ自体に'onClickListener'を実装し、ボタンのリスナーとして'this'をアサインします。アクティビティにボタンがいくつかある場合、ボタンIDを解析して、適切なボタンの 'onClick' ハンドラを実行する必要があります。

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

質問1:

これらの方法はすべて、他の選択肢はないのでしょうか?(他に必要ないのですが、ちょっと気になるので)。

私にとっては、最も直感的な方法は最新のものでしょう。タイプするコードの量が最も少なく、(少なくとも私にとっては)最も読みやすい方法です。

でも、この方法はあまり使われていないようですね。短所は何でしょうか?

質問その2.

それぞれの方法の長所と短所を教えてください。あなたの経験や良いリンクのいずれかを共有してください。

どんな意見でも歓迎します。

P.S.このトピックについてググってみたのですが、私が見つけたのは、なぜそれが良いのか悪いのかではなく、それを行うための方法についての説明だけでした。

解決方法は?

質問1. あなたが最も直感的だと言うものは、残念ながらAndroidでは最も使われていないものです。UI(XML)と計算機能(Javaクラスファイル)を分離した方が良いと理解しています。その方がデバッグもしやすくなります。この方法で読むと、実はAndroidを考えるのがとても簡単なんです。

質問2. 主に使われるのは、2番と3番だと思います。例として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 Button Viewを処理するすべてがここにあるというのは、とてもすっきりとした印象を受けます。

私の同僚がコメントしている欠点は、onclickリスナーを必要とする多くのビューがあることを想像することです。あなたは、あなたのonCreateが非常に長くなることを見ることができます。だから彼はそれを使用するのが好きです。

3

例えば、5つのクリックボタンがあるとします。

アクティビティ/フラグメントが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の計算がすべて一箇所で処理され、onCreateメソッドを混雑させないので、彼の目にはすっきり見えると同僚は説明しています。しかし、私が考える欠点は、onCreateメソッドに問題があることです。

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

もっと詳しい情報をお望みでしたら、教えてください。かなり長い質問なので、十分に答えていません。また、いくつかのサイトを見つけたら、私の答えを拡大するつもりですが、今私はいくつかの経験を与えただけです。