2013-03-05 39 views
8

Tôi có một ArrayList các Nút nơi OCL của tôi cần biết chỉ mục nào tôi đã được nhấn. Kế hoạch là như sau:Tạo một OnClickListener tùy chỉnh

MyOnClickListener onClickListener = new MyOnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Intent returnIntent = new Intent(); 
      returnIntent.putExtra("deleteAtIndex",idx); 
      setResult(RESULT_OK, returnIntent); 
      finish(); 

     } 
    }; 
    for (int i =0;i<buttonList.size();i++) { 
     buttonList.get(i).setText("Remove"); 
     buttonList.get(i).setOnClickListener(onClickListener); 
    } 

Làm cách nào để triển khai OCL của tôi?

Hiện nay tôi có điều này:

public class MyOnClickListener implements OnClickListener{ 

int index; 

public MyOnClickListener(int index) 
{ 
    this.index = index; 
} 

@Override 
public void onClick(View arg0) { 


} 

}

Tuy nhiên, tôi không chắc chắn về những gì tôi cần phải làm trong constructor của OCL của tôi, là tốt như overriden onClick chức năng.

+0

làm bạn muốn vượt qua bất kỳ dữ liệu thế nào để MyOnClickListener từ cho vòng lặp? –

+0

Có, chỉ mục. –

+0

thay đổi vòng lặp của bạn và tạo ObjectEverytime mới và chuyển chỉ mục trong cunstructor. –

Trả lời

6

thiết setOnClickListener để nút như:

buttonList.get(i).setOnClickListener(new MyOnClickListener(i)); 

EDIT:

tôi cần phải hoàn thành một hoạt động trong myOCL, thế nào tôi sẽ làm điều đó?

để hoàn thiện Hoạt động trên Nút Bấm từ lớp Hoạt động phi bạn sẽ cần phải vượt qua Hoạt động Context để tùy chỉnh của bạn OnClickListener như:

buttonList.get(i).setOnClickListener(new MyOnClickListener(i, Your_Current_Activity.this)); 

và thay đổi vị thi công của các tùy chỉnh của bạn OnClickListener lớp:

int index; 
Context context; 
public MyOnClickListener(int index,Context context) 
{ 
    this.index = index; 
    this.context=context; 
} 

@Override 
public void onClick(View arg0) { 

    // now finish Activity as\ 
    context.finish(); 
     // OR 
     // ((Activity)context).finish(); 
} 
+0

Ồ, tôi hiểu. Giả sử tôi cần hoàn thành một hoạt động trong myOCL, tôi sẽ làm như thế nào? 'lớp công khai MyOnClickListener mở rộng Hoạt động triển khai OnClickListener {' '\t \t setResult (Activity.RESULT_OK, returnIntent); \t \t kết thúc(); ' –

+0

@AdrianJandl: vượt qua Ngữ cảnh hoạt động Ngoài ra để xây dựng nút –

+0

@AdrianJandl: xem câu trả lời chỉnh sửa của tôi –

2
View.OnClickListener myListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("Button",v.getText().tostring); 
    } 
}); 

bạn sẽ nhận được giá trị nút của bạn để bạn có thể tìm thấy chỉ mục nào.

2

thay đổi vòng lặp của bạn và tạo đối tượng mới mỗi lần và chuyển chỉ mục trong hàm tạo.

for (int i =0;i<buttonList.size();i++) { 
     buttonList.get(i).setText("Remove"); 
     buttonList.get(i).setOnClickListener(new MyOnClickListener(i)); 

} 

Bạn có thể nhận chỉ mục trong phương thức onClick của mình.

0

Tôi không chắc chắn điều này áp dụng cụ thể cho trường hợp của bạn, nhưng tôi có mong muốn tạo người nghe tùy chỉnh cho các yếu tố có thể nhấp để ngăn họ nhấp hai lần (nếu người dùng nhấn nhanh). Giải pháp của tôi là tạo một lớp người nghe mà tôi chuyển Runnable tùy chỉnh đến và sau đó xử lý Runnable nếu nút được nhấp lần đầu tiên, nhưng rõ ràng là bạn có thể chuyển bất kỳ hành vi tùy chỉnh nào, đây chỉ là một cách rất đơn giản minh họa làm thế nào để sử dụng nó ...

import android.content.Context; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 



public class MyCustomOnClickListener implements View.OnClickListener { 
    public static final String TAG = MyCustomOnClickListener.class.getSimpleName(); 
    private Runnable doOnClick; 
    private Context mContext; 
    private int isClicked = 0; 
    public MyCustomOnClickListener(Context c, Runnable doOnClick) throws Exception{ 
     if(!(c instanceof Context) || !(doOnClick instanceof Runnable)) 
      throw new Exception("MyCustomOnClickListener needs to be invoked with Context and Runnable params"); 
     this.doOnClick = doOnClick; 
     this.mContext = c; 
    } 

    @Override 
    public void onClick(View view) { 
     Log.v(TAG,"onClick() - detected"); 
     if(isClicked++ > 0)return; //this prevents multiple clicks 
     Log.d(TAG, String.format("onClick() - being processed. View.Tag = \"%s\"", view.getTag().toString())); 
     new Handler(mContext.getMainLooper()).post(doOnClick); 
    } 
} 

và sau đó sử dụng nó (giả sử bạn đang ở trong một Hoạt động cho this ngữ cảnh) ...

try{ 
    Button aButton = findViewById(R.id.someButton); 
    aButton.setOnClickListener(new MyCustomOnClickListener(/*context*/this, new Runnable(){ 
    public void run(){ 
    //here you would put whatever you would have otherwise put in the onClick handler. If you need the View that's being clicked you can replace the Runnable with a custom Runnable that passes the view along 
    } 
})); 
}catch(...){ 

} 
Các vấn đề liên quan