天天看点

向监听类传递参数



我们给按钮设置监听器时,我们有可能希望给监听函数一个参数,或让该监听函数能够操作外面的变量,如下是一种愿望:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    fragmentView =  inflater.inflate(R.layout. fragment_playlist, container, false );
    
	for(int i=0;i<LocalConst.plCount;i++){
		plChooser[i] = (Button)fragmentView.findViewById(tab2RadioId(i));
		plChooser[i].setOnClickListener(new View.OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				((DirPlayerActivity)getActivity()).currentPlTab = i;//这个i访问不到
			}
			
		});
	}
    return fragmentView ;
}
           

但是遗憾的是,new出来的这个匿名内部类不能访问外面的参数i。

可以考虑先封装一个实现View.OnClickListener接口的类,然后再把这个类的对象当成监听器给按钮,利用这个类的构造函数来接收参数,如下:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    fragmentView =  inflater.inflate(R.layout. fragment_playlist, container, false );

    for (int i=0;i<LocalConst. plCount;i++){
        plChooser [i] = (Button)fragmentView .findViewById(tab2RadioId(i));
        plChooser [i].setOnClickListener( new PlChooser(i));
    }
    return fragmentView ;
}

class PlChooser implements View.OnClickListener{
    int choosed ;
    
    PlChooser( int i){//在这里接收i
        choosed = i;
    }

    @Override
    public void onClick(View v) {
    
        ((DirPlayerActivity)getActivity()). currentPlTab = choosed ;
    
    }

}