0

クリック イベントを処理する方法は 2 つあります。

  1. このようにxmlファイルで定義します
<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="doSomethingMethod"
    android:text="Click Me" />
  1. アクティビティ クラスに onclicklistener を実装し、これを行います。

パッケージcom.example.buttontest;

import android.os.Bundle;
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener; 
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener
{   
Button button;  
Button another;         
@Override   protected void
    onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);       
button = (Button)findViewById(R.id.button1);        
another = (Button)findViewById(R.id.button2); 

button.setOnClickListener(this);

another.setOnClickListener(this);
}


@Override   
public void onClick(View v) {       
  // TODO Auto-generated
  method stub       
  if(v.getId()==R.id.button1) 
  {             
   Log.d("MYTAG", "First button was clicked");  
  }

  if(v.getId()==R.id.button2)       
   {            
    Log.d("MYTAG", "Second button was clicked");    
   }
 }  

}

私の質問は、なぜ2番目のケースでメソッドを呼び出すのが難しいのですか? 違いはなんですか?そして、2番目のケースで作業することのプラスの点は何ですか?

質問が理解できない場合は、より明確に説明できるように努めますので、教えてください。

ありがとう。

4

3 に答える 3

1

これらはまったく同じです。android:onClickAPI レベル 4 で追加されたのは、より簡単に、より Javascript の Web に似たものにし、すべてを XML から駆動するためです。内部で行うことはOnClickListener、メソッドを呼び出す Button に を追加するDoItことです。

android:onClick="DoIt"内部で a を使用すると、次のようになります。

Button button= (Button) findViewById(R.id.buttonId);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DoIt(v);
    }
});

を使用することで得られるトレードオフはandroid:onClick、通常の XML 構成と同様に、動的コンテンツを追加するのが少し難しくなることだけです (プログラム的には、変数に応じてリスナーを追加するか別のリスナーを追加するかを決定できます)。DoItしかし、これはメソッド内にテストを追加することで簡単に無効になります。

   Button mClickButton1 = findViewById(R.id.clickButton1);
   mClickButton1.setOnClickListener(this);
   Button mClickButton2 = findViewById(R.id.clickButton2);
    mClickButton2.setOnClickListener(this);
  // some where 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;
              }
       }
  }

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

1.ビュー自体、

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

XML で定義android:onClick = "DoIt"しても、アクティビティ (またはビュー コンテキスト) に、まったく同じ名前とパラメーターとしてのビューで定義されたパブリック メソッドがあることを確認する必要があります。Android は、定義をアクティビティのこの実装と結び付けます。最後に、匿名の内部クラスに記述したコードと同じコードが実装されます。したがって、簡単に言えば、アクティビティで内部クラスとリスナーのアタッチメントを使用する代わりに、実装コードを含むパブリック メソッドを使用するだけです。

于 2013-09-09T11:28:35.570 に答える
0

これを試して、

package com.example.buttontest;


import android.os.Bundle;
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener; 
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener
{   
Button button;  
Button another;         
@Override   protected void
    onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);   

button = (Button)findViewById(R.id.button1);        
another = (Button)findViewById(R.id.button2); 

button.setOnClickListener(this);

another.setOnClickListener(this);
}

@Override   
public void onClick(View v) {       
  // TODO Auto-generated
  method stub       
  if(v.getId()==R.id.button1) 
  {             
   Log.d("MYTAG", "First button was clicked");  
  }

  if(v.getId()==R.id.button2)       
   {            
    Log.d("MYTAG", "Second button was clicked");    
   }
 } 

}
于 2013-09-09T11:30:53.573 に答える