9

我有一个 ArrayList 的按钮,我的 OCL 需要知道我按下了哪个索引。计划是这样的:

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);
    }

我的 OCL 实现需要是什么样的?

目前我有这个:

public class MyOnClickListener implements OnClickListener{

int index;

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

@Override
public void onClick(View arg0) {


}

}

但是,我不确定我需要在 OCL 的构造函数以及被覆盖的onClick函数中做什么。

4

4 回答 4

8

设置setOnClickListener为按钮:

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

编辑 :

我需要在 myOCL 中完成一项活动,我该怎么做?

要从非 Activity 类完成按钮单击上的 Activity,您需要将 Activity Context 传递给您的自定义 OnClickListener,如下所示:

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

并将自定义 OnClickListener 类的构造函数更改为:

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();
}
于 2013-03-05T11:04:59.680 回答
3
View.OnClickListener myListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("Button",v.getText().tostring);
    }
});

你会在视图中看到你的按钮值,你会发现它是哪个索引。

于 2013-03-05T11:07:01.147 回答
2

每次更改您的 for 循环并创建新对象并在构造函数中传递索引。

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

}

您可以在 onClick 方法中获取索引。

于 2013-03-05T11:11:06.443 回答
2

我不确定这是否特别适用于您的情况,但我希望为可点击元素创建一个自定义侦听器,以防止它们被点击两次(如果用户快速点击)。

我的解决方案是创建一个侦听器类,我将自定义 Runnable 传递给,然后在第一次单击按钮时处理该 Runnable,但显然您可以传递任何自定义行为,这只是一个非常简单的说明如何用它...

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);
    }
}

然后使用它(假设您在this上下文中的 Activity 中)...

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(...){

}
于 2018-03-10T23:50:56.617 回答