Android 如何从DatePickerFragment编辑活动中的视图?

Android 如何从DatePickerFragment编辑活动中的视图?,android,Android,我对DatePickerFragment有些意见。我无法从DatePickerFragment(onDateSet方法)获取如何在活动中编辑我的文本视图。一个有效的方法是将textview设置为静态,但在这种情况下,我得到一个警告:不要将android上下文类放置到静态字段中 我可以忽略这个警告吗?或者用什么其他方法来更新我的视图 我的代码如下所示: public class Ad1StatsFilterActivity extends BaseActivity { private static

我对DatePickerFragment有些意见。我无法从DatePickerFragment(onDateSet方法)获取如何在活动中编辑我的文本视图。一个有效的方法是将textview设置为静态,但在这种情况下,我得到一个警告:不要将android上下文类放置到静态字段中

我可以忽略这个警告吗?或者用什么其他方法来更新我的视图

我的代码如下所示:

public class Ad1StatsFilterActivity extends BaseActivity {
private static final String TAG = "Ad1StatsFilterActivity";
static TextView dateFrom;
TextView dateTo;
SimpleDateFormat dateFormatForTextView;
static String dateFromPicker;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ad1_stats_filter);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    activateToolbar(true);

    dateFrom = (TextView) findViewById(R.id.ad1_filter_period_from);
    dateTo = (TextView) findViewById(R.id.ad1_filter_period_to);

    dateFormatForTextView = new SimpleDateFormat("d MMM YYYY", Locale.getDefault());
    final DatePicker datePicker = new DatePicker(new Date());

    final String currentDateTimeString = DateFormat.getDateInstance().format(new Date());

    Spinner dateSpinner = (Spinner) findViewById(R.id.ad1_filter_date_spinner);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.ad1_date_filter, android.R.layout.simple_spinner_item);

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dateSpinner.setAdapter(adapter);

    dateSpinner.setSelection(0);
    //Spinner
    dateSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            switch (position) {
                case 1:
                    dateFrom.setText(dateFormatForTextView.format(new Date()));
                    dateTo.setText(dateFormatForTextView.format(new Date()));
                    break;

                case 2:
                    DatePickerFragment newFragment = new DatePickerFragment();
                    newFragment.show(getFragmentManager(), "datePicker");
                    Log.d(TAG, "onItemSelected: dateFromPiker = " + dateFromPicker);
                    if (dateFromPicker != null) dateFrom.setText(dateFromPicker);
                    break;
                default:
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });


}


public static class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {
    private static final String TAG = "DatePickerFragment";


    @Override
    public void onDateSet(android.widget.DatePicker view, int year, int month, int dayOfMonth) {
        final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
        dateFromPicker = dateFormatter.format(newDate.getTime());
        dateFrom.setText(dateFromPicker);


    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }


}
公共类Ad1StatsFilterActivity扩展了BaseActivity{
私有静态最终字符串TAG=“Ad1StatsFilterActivity”;
静态文本视图数据源;
文本视图日期到;
SimpleDateFormat dateFormatForTextView;
静态字符串日期选择器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u ad1\u stats\u filter);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
激活嗅杆(真);
dateFrom=(TextView)findViewById(R.id.ad1\u filter\u period\u from);
dateTo=(TextView)findViewById(R.id.ad1\u filter\u period\u to);
dateFormatForTextView=新的SimpleDataFormat(“d MMM YYYY”,Locale.getDefault());
final DatePicker DatePicker=新日期选择器(new Date());
最后一个字符串currentDateTimeString=DateFormat.getDateInstance().format(新日期());
微调器dateSpinner=(微调器)findViewById(R.id.ad1\u filter\u date\u微调器);
ArrayAdapter=ArrayAdapter.createFromResource(此,
R.array.ad1_date_filter,android.R.layout.simple_微调器_项);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
dateSpinner.setAdapter(适配器);
dateSpinner.setSelection(0);
//纺纱机
dateSpinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
开关(位置){
案例1:
dateFrom.setText(dateFormatForTextView.format(new Date());
dateTo.setText(dateFormatForTextView.format(new Date());
打破
案例2:
DatePickerFragment newFragment=新的DatePickerFragment();
show(getFragmentManager(),“datePicker”);
Log.d(标记“onItemSelected:dateFromPiker=“+dateFromPicker”);
如果(dateFromPicker!=null)dateFrom.setText(dateFromPicker);
打破
违约:
}
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
}
公共静态类DatePickerFragment扩展了DialogFragment
实现DatePickerDialog.OnDateSetListener{
私有静态最终字符串标记=“DatePickerFragment”;
@凌驾
public void onDateSet(android.widget.DatePicker视图,int year,int month,int dayOfMonth){
最终SimpleDataFormat dateFormatter=新SimpleDataFormat(“yyyy-MM-dd”,Locale.US);
dateFromPicker=dateFormatter.format(newDate.getTime());
dateFrom.setText(dateFromPicker);
}
@凌驾
创建对话框上的公共对话框(Bundle savedInstanceState){
//使用当前日期作为选择器中的默认日期
最终日历c=Calendar.getInstance();
int year=c.get(日历年);
int month=c.get(日历月);
int day=c.get(日历日期,每月的第天);
//创建DatePickerDialog的新实例并返回它
返回新的DatePickerDialog(getActivity(),this,year,month,day);
}
}
}

我还需要两个不同的日期(Date from和Date to)。我找到了一个解决方案,但现在它已被弃用。获取两个不同日期选择器对话框的最佳方法是什么

但在这种情况下,我得到一个警告:不要放置android上下文类 进入静态字段

我可以忽略这个警告吗?或者用什么其他方法来更新我的视图

永远不要尝试那样做。它会导致内存泄漏,并防止您的活动被垃圾收集

尝试从
DatePickerFragment
中删除静态修饰符:

public class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {
通过这样做,您不需要对TextView进行静态引用

我还需要两个不同的日期(Date from和Date to)


这是你应该处理的事情。例如,您可以使用布尔标识符来指示所选日期是从日期开始的日期还是从日期开始的日期。首先,不需要将DatePickerFragment类设置为静态,也不需要将文本视图设置为静态。从DatePickerFragment更新文本视图的干净解决方案是

  • 声明一个接口,比如

    接口日期更改列表器{
    onDatePicked(字符串日期);
    }

  • 在活动中实现接口,并在从活动创建接口impl对象时将其传递给DatePickFragment

  • 每当用户从DatePickerFragment中选择日期左右时,调用接口impl对象
  • 接口的实现将包含更新活动本身内部的文本视图

  • 正如你们所说,我删除了静态修饰符,但我现在得到了警告:这个片段内部类应该是静态的。(项目编译没有错误)如何将接口impl对象传递给DatePickFragment?将其传递给构造函数?但是“在片段中避免非默认构造函数”呢?