Development Tip

OnClickListener에 매개 변수를 전달하는 방법은 무엇입니까?

yourdevel 2020. 12. 13. 11:16
반응형

OnClickListener에 매개 변수를 전달하는 방법은 무엇입니까?


OnClickListener ()에 매개 변수를 어떻게 전달할 수 있습니까?

내 리스너 :

   OnClickListener myListener = new OnClickListener()
   {

     @Override
     public void onClick(View v)
     {
         //I want to reach params here

     }

  };

12 개의 버튼이 있고 12 명의 리스너를 작성하고 싶지 않습니다. 문자열을 전달하는 것이 좋을 것이고 완전히 다른 작업을 수행 할 수 있습니다.


고유 한 사용자 지정 OnClickListener 사용

public class MyLovelyOnClickListener implements OnClickListener
   {

     int myLovelyVariable;
     public MyLovelyOnClickListener(int myLovelyVariable) {
          this.myLovelyVariable = myLovelyVariable;
     }

     @Override
     public void onClick(View v)
     {
         //read your lovely variable
     }

  };

이 문제에 대한 또 다른 해결책 은 일반 메소드를 생성하고 View추가 하려는 매개 변수onClickListener전달하고 함께 사용하려는 매개 변수전달할 수 있습니다.

Button b1 = new Button();
String something = "something";
Button b2 = new Button();
String anotherSomething = "anotherSomething";
setOnClick(b1, something);
setOnClick(b2, anotherSomething);

private void setOnClick(final Button btn, final String str){
    btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {

                  // Do whatever you want(str can be used here)

           }
    });
}

  1. 활동이 View.OnClickListener를 구현하도록하십시오.
  2. 리스너에 버튼 등록
  3. onClick에서 어떤 버튼이 클릭되었는지 확인하십시오.
  4. 클릭 한 버튼에 따라 문자열 처리

    public class _Test2Activity extends Activity implements OnClickListener {
    
       private Button button1;
       private Button button2;
       private Button button3;
    
       private String myString;
    
       @Override
       public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
    
         button1 = (Button)findViewById(R.id.button1);
         button2 = (Button)findViewById(R.id.button2);
         button3 = (Button)findViewById(R.id.button3);
    
         button1.setOnClickListener(this);
         button2.setOnClickListener(this);
         button3.setOnClickListener(this);   
    
         myString = "This is a string";
    
       } 
    
       @Override
       public void onClick(View v) {
           if(v==button1) {
              //do something with myString
           } else if(v==button2) {
              //do something with myString
           } else if (v==button3) {
              //do something with myString
           }
       }
    }
    

나는 이것이 늦은 대답이라는 것을 알고 있지만 누군가를 도울 수 있기를 바랍니다. 내 상황에서는 기존 답변 중 어느 것도 작동하지 않았지만 버튼처럼 작동하는 이미지의 setTag 기능을 사용하게되었습니다. 내 계정 정보는 활동이 시작될 때 설정된 전역 멤버 변수에 있습니다.

이 경우 각 행이 계정 인 테이블을 설정합니다. 이미지를 클릭하면 계정 세부 정보가 표시됩니다 (이미지는 정보 아이콘 일 뿐임).
그러므로:

// prior code....
// NOTE: oneAccount is an object (AccountInfo) holding information about the account

// column with the "detail" arrow
image1 = new ImageView(this);
image1.setImageResource(R.drawable.info);
image1.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
image1.setPadding(15, 1, 15, 1);
image1.setTag(oneAccount);
// add a listener to go to that account detail on a click
image1.setOnClickListener(new TextView.OnClickListener() {
    public void onClick(View v) {
    // change the color to signify a click
    v.setBackgroundColor(getResources().getColor(R.color.button_selected));


    // get what we need out of the tag
    AccountInfo thisAcct = (AccountInfo) v.getTag();

        // your code would do other stuff here

}
});

// add the image to the table row
tr1.addView(image1);

사용은 아래 코드와 같이 OnClickListener를 구현합니다.

public class Test extends Activity implements OnClickListener{
    Button btn1;
    Button btn2;
    Button btn3;
    Button btn4;
    Button btn5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //initialize btn...~~~

        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch(view.getId()) {
            case will be determine by Button's Id (R.id.blablabla)
        }
}

보기와 연결된 정적 콘텐츠가있는 경우 다른 옵션은 HashMap보기 ID를 콘텐츠에 매핑하는 데 사용하는 것입니다.

private static Map<Integer, String> idToStringMap = new HashMap<Integer, String>();

에서지도 초기화 onCreate:

idToStringMap.put(R.id.button1, "hello");
idToStringMap.put(R.id.button2, "world");
// ...

그런 다음 뷰 ID에서 값을 가져옵니다 onClick.

public void onClick(View v) {

    String myString = idToStringMap.get(v.getId());
}

이것은 긴 스위치 케이스 세트를 사용하는 것보다 조금 더 깨끗합니다.


Note that you do this in Kotlin a little differently from how you do it in Java. In Kotlin, you append NameOfParentClass() to the subclass declaration.

Now override Activity‘s onCreate() method. It will look something like this.

class MainActivity : AppCompatActivity() {
        private var btnClick: Button? = null
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            btnClick = findViewById(R.id.btnClick) as Button
            btnClick!!.setOnClickListener { startActivity(Intent(this@MainActivity, KotlinActivity::class.java)) }
        }
    }

Another solution may be to not write the code directly inside onClick() method, alternatively, write the code in a separate method, and then call that method in onClick().

Example:

button.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    function();
   }
});

private void function() {
 //your code here
}

참고URL : https://stackoverflow.com/questions/10614696/how-to-pass-parameters-to-onclicklistener

반응형