Вопрос

I am trying to create date pickers dynamically (where I do not know the exact number).

I was referring to this tutorial http://javapapers.com/android/android-datepicker/.

In my code I create date pickers in the following way :-

TableRow row = new TableRow(this);
    row.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

    edit = new EditText(this);
    edit.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
    edit.setHint("Tap to select "+input_desc[index]);
    edit.setFocusable(false);
    edit.setClickable(true);


    edit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
            DialogFragment newFragment = new SelectDateFragment();
            newFragment.show(getSupportFragmentManager(), "DatePicker");
        }
    });
    allElement_date.add(edit);

    row.addView(edit);
    table.addView(row);

The above code gets called unknown number of times. Then I have the follwing code:-

@SuppressLint("ValidFragment")
public class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Calendar calendar = Calendar.getInstance();
        int yy = calendar.get(Calendar.YEAR);
        int mm = calendar.get(Calendar.MONTH);
        int dd = calendar.get(Calendar.DAY_OF_MONTH);
        return new DatePickerDialog(getActivity(), this, yy, mm, dd);
    }

    public void onDateSet(DatePicker view, int yy, int mm, int dd) {
        populateSetDate(yy, mm+1, dd);
    }
}

However as you can see there is no way to distinguish between the different clicks on the editText to set them differently.

public void populateSetDate(int year, int month, int day) 
{
}

Could someone please help me how to figure out which edit text has been clicked and set them independently.

Thanks in advance.

Это было полезно?

Решение

Extend your SelectDateFragment class with the following constructor, keeping a reference to the EditText field:

public class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    private EditText edit

    public SelectDateFragment(EditText edit) {
        this.edit = edit;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Calendar calendar = Calendar.getInstance();
        int yy = calendar.get(Calendar.YEAR);
        int mm = calendar.get(Calendar.MONTH);
        int dd = calendar.get(Calendar.DAY_OF_MONTH);
        return new DatePickerDialog(getActivity(), this, yy, mm, dd);
    }

    public void onDateSet(DatePicker view, int yy, int mm, int dd) {
        populateSetDate(edit, yy, mm+1, dd);
    }
}

And in the populateSetDate method:

public void populateSetDate(EditText edit, int year, int month, int day) 
{
    edit.setText( day + "." + month + "." + year);
}

So that when you create the EditText field and its onClick event, you can pass the field:

TableRow row = new TableRow(this);
row.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

edit = new EditText(this);
edit.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
edit.setHint("Tap to select "+input_desc[index]);
edit.setFocusable(false);
edit.setClickable(true);


edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
        DialogFragment newFragment = new SelectDateFragment(edit);
        newFragment.show(getSupportFragmentManager(), "DatePicker");
    }
});
allElement_date.add(edit);

row.addView(edit);
table.addView(row);

Of course you could use some more elaborate form of date formatting when calling setText() instead of just building it together with "+" string concatenation. And maybe you don't want to pass values for year, month and date separately, but that's just cosmetics that are not part of your initial problem.

Другие советы

Firstly init TableLayout and in this layout add tableRow ,TableRow not added directlly .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top