2012-08-01 5 views
14

여기에서 자습서를 진행 중입니다. http://developer.android.com/guide/topics/ui/controls/pickers.htmlAndroid Datepicker Fragment - 사용자가 날짜를 설정하면 어떻게해야합니까?

일이 있고 날짜 표시기가 나타납니다. 그러나, 나는 사용자가 날짜를 설정할 때 행동하는 방법에 붙어있다.

public void onDateSet(DatePicker view, int year, int month, int day) { 
    // Do something with the date chosen by the user 
} 

하지만 거기에 코드를 넣으면 그 아무것도하지 않는 :

나는 그들이이 방법을 참조하십시오.

자바에 익숙하지 않아 선택한 날짜로 텍스트 뷰를 업데이트하기 위해 추가 코드가 필요한지 잘 모르겠습니다.

나는이 코드를 추가했다 :

private DatePickerDialog.OnDateSetListener mDateListener = 
     new DatePickerDialog.OnDateSetListener() { 
      public void onDateSet(DatePicker view, int year, int month, int day) { 
       updateDate(year, month, day); 
      } 
     }; 

public void updateDate(int year, int month, int day) { 
    TextView bdate = (TextView)findViewById(R.id.birthDate); 
    Date chosenDate = new Date(year, month, day); 
    java.text.DateFormat dateFormat = DateFormat.getDateFormat(getApplicationContext()); 
    bdate.setText(dateFormat.format(chosenDate)); 
} 

을하지만 아무것도하지 않습니다.

나는이 거의 정확한 질문을 찾았어요

: 해당 솔루션에 그러나 Get date from datepicker using dialogfragment

(EditSessionActivity가)에만 EditSessionActivity 작업에 DatePickerFragment 클래스를 제한 사용하지 않는 것입니까?

답변

9

DialogFragment에 인수를 전달하려면 정적 팩터 리를 사용해야합니다. docs에서

"모든 조각에는 빈 생성자가 있어야하므로 활동 상태를 복원 할 때 인스턴스화 할 수 있습니다. 하위 클래스에는 매개 변수가있는 다른 생성자가 없어야합니다. 이러한 생성자는 프래그먼트가 다시 인스턴스화되는 대신 호출자가 setArguments (Bundle)를 사용하여 인수를 제공하고 나중에 getArguments()를 사용하여 Fragment에서 인수를 가져올 수 있습니다.

마찬가지로 Fragment 하위 클래스는 정적이어야하며 부모 작업이나 Fragment에 의존하지 않고 자체적으로 인스턴스화 할 수 있어야합니다. 이 가이드 라인을 준수하지 않으면 조각이 다시 시작될 때 충돌 또는 오류가 발생하는 경우가 있습니다.

Android의 docs에서 DialogFragment를 빌드하는 데 권장되는 방법은 정적 팩터 리 방법을 사용하는 것입니다. 다음과 같이

public static class DatePickerFragment extends DialogFragment{ 

    private OnDateSetListener onDateSetListener; 

    static DatePickerFragment newInstance(Date date, OnDateSetListener onDateSetListener) { 
     DatePickerFragment pickerFragment = new DatePickerFragment(); 
     pickerFragment.setOnDateSetListener(onDateSetListener); 

     //Pass the date in a bundle. 
     Bundle bundle = new Bundle(); 
     bundle.putSerializable(MOVE_IN_DATE_KEY, date); 
     pickerFragment.setArguments(bundle); 
     return pickerFragment; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     super.onCreateDialog(savedInstanceState); 

     Date initialDate = (Date) getArguments().getSerializable(MOVE_IN_DATE_KEY); 
     int[] yearMonthDay = ymdTripleFor(initialDate); 
     DatePickerDialog dialog = new DatePickerDialog(getActivity(), onDateSetListener, yearMonthDay[0], yearMonthDay[1], 
       yearMonthDay[2]); 
     return dialog; 
    } 

    private void setOnDateSetListener(OnDateSetListener listener) { 
     this.onDateSetListener = listener; 
    } 

    private int[] ymdTripleFor(Date date) { 
     Calendar cal = Calendar.getInstance(Locale.US); 
     cal.setTime(date); 
     return new int[]{cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)}; 
    } 
} 

당신은 다음이 대화 조각 중 하나를 만들 수 있습니다 :

DatePickerFragment.newInstance(yourDate, yourOnDateSetListener); 
+1

아마 당신은 (당신이 먼저 조각을 인스턴스화하고 그것의 '쇼를 사용하면 대화 상자가 팝업 것을 추가해야)'메소드를 사용하여 화면에 표시합니다. –

2

내가 하나가 사용할 수 있습니다 믿고 여기에 초기 날짜에 걸리고 OnDateChangedListener 날짜 선택기 조각의 예 여기 DialogFragments :

DialogFragment newFragment = new DatePickerFragment(); 
newFragment.show(getSupportFragmentManager(), "datePicker"); 

는 DatePickerFragment를 정의하고 아래의 방법을 구현

public void onDateSet(DatePicker view, int year, int month, int day) { 
// Do something with the date chosen by the user 
DateEdit.setText(day + "/" + (month + 1) + "/" + year); 
} 

Android DialogFragment Example에서 취한 것입니다.

1

이 코드는 완벽하게 작동합니다!, win10 Android Studio 2.2를 사용하고 있습니다 ...

import android.app.Dialog; 
import android.support.v4.app.DialogFragment; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.app.DatePickerDialog; 
import android.widget.DatePicker; 
import android.widget.EditText; 
import java.util.Calendar; 


public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);} 

    public void datePicker(View view){ 
     DatePickerFragment fragment_date = new DatePickerFragment(); 
     fragment_date.show(getSupportFragmentManager(),"datePicker");} 

    @Override 
    public void onDateSet(DatePicker view, int year, int month, int day) { 
     String day_x = ""+ day ,month_x = ""+(month+1); 
     if (day < 9){ day_x = "0" + day_x;} 
     if (month < 9){ month_x = "0" + month_x;} 
     ((EditText) findViewById(R.id.txtDate)).setText(day_x + "/" + month_x + "/" + year);} 

    public static class DatePickerFragment extends DialogFragment { 
     @Override 
     public Dialog onCreateDialog (Bundle savedInstanceState){ 
      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); 
      return new DatePickerDialog(getActivity() ,(DatePickerDialog.OnDateSetListener)this,day,month,year);}} 

} 

나는 "텍스트 뷰 txtDate로"와 "onclick을 = 날짜 선택기와 버튼"을했습니다

관련 문제