How can I dynamically disable a single required field from validation in a form? This is an extension of this question: 

Need help with AJAX callback function for text field validation in form_alter

I have a form with a Username autocomplete field (txn_user). The editors want to be able to enter a UID (txn_userid) as an alternative way of specifying the User for the form. They want to be able to enter the UID and skip the Username field altogether. 

So in my form validation function, I want to be able to disable the required property (and all other validation) of the Username field during a Submit IF the editor typed in a UID field. In other words: the UID field should 'short-circuit' the Username field.

This is what I have so far (which doesn't work, obviously). Or do I need to do this via AJAX or straight JS?

function _validate_add_userpoints_userid(&amp;$form, &amp;$form_state) {
    $values = $form_state['values'];
    if( $values['txn_userid'] ) {
        $newuser = user_load($values['txn_userid']);
        if( ! $newuser) {
          form_set_error('txn_userid', 'You have entered an invalid UID. Either leave this blank and select a Username or enter a valid UID');          
    }
    else {  
        // this part works... the User Name is properly assigned.
        $form['txn_user']['#value'] = $newuser-&gt;name;       
        $form_state['values']['txn_user'] = $newuser; 
        $form_state['input']['txn_user'] = $newuser-&gt;name;          

        // this part doesn't work... the User Name field is still required on submit.
        $form['txn_user']['#disabled'] = TRUE;
        $form['txn_user']['#ajax_processed'] = TRUE;
        $form['txn_user']['#required'] = FALSE;
        $form['txn_user']['#needs_validation'] = FALSE;         
        unset($form['txn_user']['#process']);
    }
}


}
Why dont you use conditional field module? 

https://www.drupal.org/project/conditional_fields

By this module you can disable the requirement of fields when something happens to another field. you can also implement your form as a content type so its node/add page will be your form. Then by using the different hooks you can add autocomplete field or do any thing else