【问题标题】:How to handle dynamically created datepickers?如何处理动态创建的日期选择器?
【发布时间】:2013-07-03 16:42:00
【问题描述】:

我正在尝试动态创建日期选择器(我不知道确切的数字)。

我指的是本教程http://javapapers.com/android/android-datepicker/

在我的代码中,我通过以下方式创建日期选择器:-

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

上面的代码被调用了未知的次数。然后我有以下代码:-

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

但是,正如您所见,无法区分 editText 上的不同点击以进行不同的设置。

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

有人可以帮我弄清楚点击了哪些编辑文本并独立设置它们。

提前致谢。

【问题讨论】:

  • 伙计们,在这里需要你的帮助。
  • 您可以在 SelectDateFragment 的构造函数中传递对 EditText 的引用,也可以在 populateSetDate 方法中传递这个引用:DialogFragment newFragment = new SelectDateFragment(edit); 或者只保留对行索引的引用并从表中获取 EditText需要。由于我不确定这是否是您想要的,所以我将其作为评论而不是答案。如果这是您正在寻找的方法,请随时询问更多详细信息。
  • @Zerga 是的,我一直在寻找这样的东西。请从您提到的替代方案中建议哪种方法是最好的。您能否详细说明一下。

标签: android android-layout android-dialog android-datepicker datepickerdialog


【解决方案1】:

使用以下构造函数扩展您的 SelectDateFragment 类,保留对 EditText 字段的引用:

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

而在populateSetDate 方法中:

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

这样当您创建EditText 字段及其onClick 事件时,您可以传递该字段:

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

当然,您可以在调用setText() 时使用一些更精细的日期格式,而不是仅仅将它与“+”字符串连接一起构建。也许您不想分别传递年、月和日期的值,但这只是装饰,不属于您最初的问题。

【讨论】:

    【解决方案2】:

    首先初始化 TableLayout 并在这个布局中添加 tableRow ,TableRow 不是直接添加的。

    【讨论】:

    • 当然我是先初始化表格布局的。这不是完整的代码。
    猜你喜欢
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 2015-07-11
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多