2012-05-16 28 views
50

Làm thế nào tôi có thể chuyển tham số cho một OnClickListener()?Cách chuyển tham số cho OnClickListener?

Got Listener tôi:

OnClickListener myListener = new OnClickListener() 
    { 

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

    } 

    }; 

tôi có 12 nút và tôi không muốn viết 12 thính giả cho họ, nó sẽ là tuyệt vời để chỉ cần vượt qua một chuỗi với họ và họ có thể làm những việc hoàn toàn khác nhau.

Trả lời

135

Sử dụng tùy chỉnh của riêng bạn 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 
    } 

    }; 
+0

Không thể sử dụng nếu lớp học của tôi đã mở rộng? – Skynet

+0

Có lợi thế nào cho phương pháp này không khi sử dụng biến thành viên và sau đó gán giá trị cho nó và truy cập vào bên trong onClick? Nếu có? –

+0

Điều này trả lời câu hỏi mặc dù nó cũng làm cho nó rõ ràng rằng người nghe phải được thiết kế như một phương pháp không phải là một lớp thổi đầy đủ. Sẽ đơn giản hơn rất nhiều khi vượt qua phương thức ẩn danh với arg tùy chỉnh (ví dụ: Xem v) –

0

sử dụng thực hiện OnClickListener như dưới đây đang

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) 
     } 
} 
7
  1. Có hoạt động của bạn thực hiện View.OnClickListener
  2. đăng ký các nút của bạn cho người nghe
  3. Kiểm tra nút nào được nhấp trong onClick
  4. Process chuỗi của bạn tùy thuộc vào nút được nhấp

    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 
         } 
        } 
    } 
    
-1

Một giải pháp khác có thể để không viết mã trực tiếp bên trong phương pháp onClick(), cách khác, viết mã trong một phương pháp riêng biệt, và sau đó gọi phương thức đó trong onClick().

Ví dụ:

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

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

Ok, nhưng câu hỏi xác định rõ ràng sự cần thiết phải vượt qua các tham số –

+0

mà sẽ không cho phép anh ta vượt qua các tham số –

5

Tôi biết đây là một câu trả lời cuối nhưng hy vọng nó có thể giúp ai đó. Không có câu trả lời nào tồn tại trong tình huống của tôi nhưng tôi đã sử dụng tính năng setTag của một hình ảnh hoạt động như một nút. Thông tin tài khoản của tôi nằm trong biến thành viên toàn cầu đã được thiết lập khi hoạt động bắt đầu.

Trong trường hợp này, tôi đang thiết lập một bảng với mỗi hàng là một tài khoản. Chi tiết tài khoản được hiển thị khi hình ảnh được nhấp (hình ảnh chỉ là biểu tượng thông tin).
Như vậy:

// 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); 
+0

Cách tiếp cận ổn định mát mẻ :) có thể được sử dụng trơn tru với ràng buộc dữ liệu. thnx –

12

Một giải pháp cho vấn đề đó, bạn có thể tạo ra một phương pháp thông thường và chuyển cho nó trở thành View bạn muốn thêm onClickListener với nó, và vượt qua các thông số bạn muốn sử dụng cùng với nó:

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) 

      } 
    }); 
} 
0

Nếu bạn có nội dung tĩnh được liên kết với chế độ xem, một tùy chọn khác là sử dụng HashMap để ánh xạ id chế độ xem cho nội dung.

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

Khởi tạo bản đồ trong onCreate:

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

Sau đó lấy giá trị từ quan điểm id trong onClick:

public void onClick(View v) { 

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

Đây là một chút bụi hơn là sử dụng một tập dài của chuyển đổi các trường hợp.

0

Lưu ý rằng bạn thực hiện điều này trong Kotlin một chút khác với cách bạn thực hiện trong Java. Trong Kotlin, bạn thêm NameOfParentClass() vào khai báo lớp con.

Bây giờ, hãy ghi đè phương thức Hoạt động của onCreate(). Nó sẽ trông như thế này

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([email protected], KotlinActivity::class.java)) } 
     } 
    } 
Các vấn đề liên quan