Wednesday, February 13, 2013

Accessing the Inaccessibles

Today we faced some strange problem where we need DatePicker from DatePickerDialog,our main goal was perform some DatePicker level operation,as we need to override the OnTimeChangedListener.

After some discussion about the possible solution we come across suggested solution such as Custom TimePicker Dialog etc.

But at last we strict to basics.In that moment Java Reflection come to rescue us.And here is our solution.

 
import java.lang.reflect.Field;
import java.util.Calendar;
import android.app.Activity;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.os.Bundle;
import android.view.View;
import android.widget.TimePicker;
import android.widget.Toast;
import android.widget.TimePicker.OnTimeChangedListener;

public class MainActivity extends Activity {
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 }
 public void validateAction(View v) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
  showFromPicker();
 }
 private void showFromPicker() throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
  Calendar cr = Calendar.getInstance();
  cr.set(Calendar.HOUR_OF_DAY, 12);
  cr.set(Calendar.MINUTE, 45);
  TimePickerDialog picker = new TimePickerDialog(this,
    timeFromPickerListener, cr.get(Calendar.HOUR_OF_DAY),
    cr.get(Calendar.MINUTE), false);
  Field timePickerField = picker.getClass().getDeclaredField("mTimePicker");
  timePickerField.setAccessible(true);
  TimePicker timePicker = (TimePicker) timePickerField.get(picker);
  timePicker.setOnTimeChangedListener(new OnTimeChangedListener() {   
   @Override
   public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    Toast.makeText(MainActivity.this, "Mamo", Toast.LENGTH_SHORT).show();
   }
  });
  picker.show();
 }
 OnTimeSetListener timeFromPickerListener = new OnTimeSetListener() {
  @Override
  public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
  }
 };
}

No comments:

Post a Comment