Java 从日期选择器更新TextView

Java 从日期选择器更新TextView,java,android,function,static,datepicker,Java,Android,Function,Static,Datepicker,我试图从日期选择器内部更新TextView,但是我得到了错误 “无法从静态上下文引用非静态方法(updateDateTextView(long)) 这是我的DatePickerFragment.java public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Override public Dialog onCr

我试图从日期选择器内部更新TextView,但是我得到了错误

“无法从静态上下文引用非静态方法(updateDateTextView(long))

这是我的DatePickerFragment.java

public class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {

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

    public void onDateSet(DatePicker view, int year, int month, int day) {
        Calendar calendar = new GregorianCalendar(year, month, day);
        long timestamp = TimeUnit.MILLISECONDS.toSeconds(calendar.getTimeInMillis());
        AddItem.updateDateTextView(timestamp);
    }
}
下面是AddItem.java中的函数,它是一个活动

      public  class AddItem extends AppCompatActivity {

    Context ctx = this;


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

    }
    public void showDatePickerDialog(View v) {
        DialogFragment newFragment = new DatePickerFragment();
        newFragment.show(getFragmentManager(), "datePicker");
    }

    public void updateDateTextView(long timestamp){
        TextView textViewToChange = (TextView) findViewById(R.id.openDate);
        Calendar cal = Calendar.getInstance(Locale.ENGLISH);
        cal.setTimeInMillis(timestamp);
        String date = DateFormat.format("dd-MM-yyyy", cal).toString();
        textViewToChange.setText(date);
    }

}
您正在这样做:

public void onDateSet(DatePicker view, int year, int month, int day) {
        Calendar calendar = new GregorianCalendar(year, month, day);
        long timestamp = TimeUnit.MILLISECONDS.toSeconds(calendar.getTimeInMillis());
        AddItem.updateDateTextView(timestamp); ///Here is the error
    }
错误在于AddITem.updateDateTextView错误。updateDateTextView方法不是静态的

您需要有目的地启动该活动,并且在生命周期的某个地方调用方法
updateDataTextView

修改方法并使其静态(但这不是一个好的开发人员想法)


非静态方法不能与静态类一起使用 试着改变现状

public void updateDateTextView(长时间戳){
.....
}


正如他们所说的,您不能像调用静态方法那样调用非静态方法。试试这个:

实现活动中的
DatePickerDialog.OnDateSetListener
和逻辑:

public class AddItem extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {

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


    showDatePickerDialog();
}

public void showDatePickerDialog() {
    DatePickerFragment newFragment = new DatePickerFragment();
    newFragment.init(this, this);
    newFragment.show(getSupportFragmentManager(), "date_picker");
}

public void updateDateTextView(long timestamp){
    TextView textViewToChange = (TextView) findViewById(R.id.openDate);
    Calendar cal = Calendar.getInstance(Locale.ENGLISH);
    cal.setTimeInMillis(timestamp);
    String date = DateFormat.format("dd-MM-yyyy", cal).toString();
    textViewToChange.setText(date);
}

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

    Calendar calendar = new GregorianCalendar(year, monthOfYear, dayOfMonth);
        long timestamp = TimeUnit.MILLISECONDS.toSeconds(calendar.getTimeInMillis());

        updateDateTextView(timestamp);
}
并使用侦听器初始化DatePicker,该类应如下所示:

public static class DatePickerFragment extends DialogFragment {

    DatePickerDialog.OnDateSetListener listener;
    Context context;

    public void init(Context context, DatePickerDialog.OnDateSetListener listener) {
        this.listener = listener;
        this.context = context;
    }

    @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(context, listener, year, month, day);
    }

}

我试过了,它成功了。

或者可以在DatePickerFragment类中定义一个,如下面的代码所示

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

DateChooserListenerHandler dateChooserListenerHandler;
@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);
}
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
    Calendar calendar = new GregorianCalendar(year, month, day);
    long timestamp = TimeUnit.MILLISECONDS.toSeconds(calendar.getTimeInMillis());
    //Note this is where the updateTextView method in the interface is invoked from
    ((DateChooserListenerHandler) getActivity()).updateTextView(timestamp);
}

//Define an interface with a method that takes long, it will be overridden by classes that implement the interface
public interface DateChooserListenerHandler{

    public void updateTextView(long s);
}
public class AddItem extends AppCompatActivity implements DatePickerFragment.DateChooserListenerHandler {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

public void showDatePickerDialog(View v) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getSupportFragmentManager(), "timePicker");
}

//The overridden method from the interface defined in DatePickerFragment class
@Override
public void updateTextView(long s) {
    updateDateTextView(s);
}

public void updateDateTextView(long timestamp){
    TextView textViewToChange = (TextView) findViewById(R.id.textView);
    Calendar cal = Calendar.getInstance(Locale.ENGLISH);
    cal.setTimeInMillis(timestamp);
    String date = DateFormat.format("dd-MM-yyyy", cal).toString();
    textViewToChange.setText(date);
}
}

AddItem activity类然后可以像下面的代码一样实现接口

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

DateChooserListenerHandler dateChooserListenerHandler;
@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);
}
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
    Calendar calendar = new GregorianCalendar(year, month, day);
    long timestamp = TimeUnit.MILLISECONDS.toSeconds(calendar.getTimeInMillis());
    //Note this is where the updateTextView method in the interface is invoked from
    ((DateChooserListenerHandler) getActivity()).updateTextView(timestamp);
}

//Define an interface with a method that takes long, it will be overridden by classes that implement the interface
public interface DateChooserListenerHandler{

    public void updateTextView(long s);
}
public class AddItem extends AppCompatActivity implements DatePickerFragment.DateChooserListenerHandler {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

public void showDatePickerDialog(View v) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getSupportFragmentManager(), "timePicker");
}

//The overridden method from the interface defined in DatePickerFragment class
@Override
public void updateTextView(long s) {
    updateDateTextView(s);
}

public void updateDateTextView(long timestamp){
    TextView textViewToChange = (TextView) findViewById(R.id.textView);
    Calendar cal = Calendar.getInstance(Locale.ENGLISH);
    cal.setTimeInMillis(timestamp);
    String date = DateFormat.format("dd-MM-yyyy", cal).toString();
    textViewToChange.setText(date);
}
}

这对我来说很好,但是,我没有检查它对应用程序性能的影响,但我发现它更容易。 如果您只是想直接从DatePickerFragment更新TextView,那么您可以像下面这样做

 @Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
    Calendar calendar = new GregorianCalendar(year, month, day);
    long timestamp = TimeUnit.MILLISECONDS.toSeconds(calendar.getTimeInMillis());
    TextView textView = (TextView) getActivity().findViewById(R.id.textView);
    textView.setText(timestamp + "");
}

您正在从静态方法调用updateDateTextView方法。。。请发布MCVE…我已将MCVE添加到原始post。这样做会在带有findViewByID的updateDateTextView()函数中导致错误,错误相同-“非静态方法(findViewByID(int))无法从静态上下文引用您是否正在尝试访问datepicker标题?我正在尝试使用datepicker的值更新AddItem活动中的TextView如何不能从静态方法调用它?