2015-11-08 176 views
0

我正在嘗試設置用戶從棒棒糖日期/時間選取器中選擇的日期/時間。我遇到的問題是設置爲Button Text的日期/時間沒有問題。問題是它不會保存在它所在的字符串中。然後我想使用該字符串來處理我知道該怎麼做的事情。使用日期/時間選取器顯示日期/時間Android

日期選擇器類

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

     final Calendar c = Calendar.getInstance(); 
     int mYear = c.get(Calendar.YEAR); 
     int mMonth = c.get(Calendar.MONTH); 
     int mDay = c.get(Calendar.DAY_OF_MONTH); 


     Date d = new Date(year, month, day); 
     SimpleDateFormat sdf = new SimpleDateFormat("EE, MMM dd, yyyy"); 
     // String newDate = sdf.format(d); 
     Toast.makeText(getActivity(), mMonth, Toast.LENGTH_LONG).show(); 
     Toast.makeText(getActivity(), mDay, Toast.LENGTH_LONG).show(); 
     Toast.makeText(getActivity(), mYear, Toast.LENGTH_LONG).show(); 

    } 


} 

片段CLASS

public class Request extends Fragment { 




    public TextView mCurrentUser; 

    public Button Request_Button; 
    public Button RButton_Date; 
    public Button RButton_Time; 

    public String cug; 
    public String cu; 
    public String time; 
    public String date; 

    //Request newInstance() 
    public static Request newInstance() { 

     Request fragment = new Request(); 
     return fragment; 

    } 

    //Needed empty Request Constructor 
    public Request() { 
    } 

    //Public onCreateView 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     //Make a view 
     View rootview = inflater.inflate(R.layout.fragment_request, container, false); 

     //Where you would initialize your variables 
     RButton_Date =(Button)rootview.findViewById(R.id.Request_Button_Date); 
     RButton_Time =(Button)rootview.findViewById(R.id.Request_Button_Time); 
     Request_Button = (Button)rootview.findViewById(R.id.Request_Button_Request); 

     //Current User Logged In 
     this.mCurrentUser = (TextView)rootview.findViewById(R.id.Current_User_TV); 
     date = new SimpleDateFormat("EE, MMM dd, yyyy").format(new Date().getTime()); 
     time = new SimpleDateFormat("h:mm a").format(new Date().getTime()); 
     RButton_Time.setText(time); 
     RButton_Date.setText(date); 

     //Showing current user 

     final ParseUser mCurrentUser = ParseUser.getCurrentUser(); 
     if(mCurrentUser == null){ 
      String mCurUserNull = "No User Logged on"; 
      this.mCurrentUser.setText(mCurUserNull); 

     } 
     else{ 
      cu = mCurrentUser.get("FirstName").toString(); 
      cug = String.format("Hi! %s do you need a technician today?", cu); 
      this.mCurrentUser.setText(cug); 

     } 


     //================================================================= 

     //Create Dialog 
     RButton_Date.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Do Stuff 

       DialogFragment picker = new DatePickerFragment(); 
       picker.show(getFragmentManager(), "datePicker"); 


      } 
     }); 
     DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() { 
      @Override 
      public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 

      } 
     }; 

     RButton_Time.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       DialogFragment picker1 = new TimePickerFragment(); 
       picker1.show(getFragmentManager(), "timePicker"); 

      } 
     }); 

       Request_Button.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         //Write Code for Gathering Variables and sending request email!!! 
         //Gather user info 
         //Populate email 
         //Send Username Request to [email protected] 
         Toast.makeText(getActivity(), cu + " Requested a tech at "+time 
           +", on "+date, Toast.LENGTH_SHORT).show(); 
        } 
       }); 




     //return rootview 
     return rootview; 
    } 

我不明白這是什麼,我做錯了。它會產生資源不明的錯誤。我已經Google搜索,廣泛搜索Stackoverflow。 2014年和以後的一切都不起作用。

目標

我只是想通過用戶選擇被用作可以設置一個按鍵內的部分文本字符串日期/時間。我正在使用Google 的示例代碼。

EDIT

ONDATESET

public void onDateSet(DatePicker view, int year, int month, int day) { 
     Button DateButton = (Button) getActivity().getWindow().getDecorView().getRootView().findViewById(R.id.Request_Button_Date); 
     String stringDueDateFrag = (month+1) + "/" + day + "/" + year + " "; 
     DateButton.setText(stringDueDateFrag); 

     // Set up a Calendar object to capture the user selected date in case the user wants 
     // edit the date later. Put the user selected date in a Bundle for onCreateDialog function to use. 



    } 

ONTIMESET

public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
     Button TimeButton = (Button) getActivity().getWindow().getDecorView().getRootView().findViewById(R.id.Request_Button_Date); 
     String stringDueDateFrag = hourOfDay + ":" + minute; 
     TimeButton.setText(stringDueDateFrag); 
    } 

LOG

11-08 15:07:39.229 4922-4966/com.megliosolutions.bitsnbytes W/EGL_emulation: eglSurfaceAttrib not implemented 
11-08 15:07:39.229 4922-4966/com.megliosolutions.bitsnbytes W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xa5486920, error=EGL_SUCCESS 
11-08 15:07:59.658 4922-4929/com.megliosolutions.bitsnbytes W/art: Suspending all threads took: 15.332ms 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime: FATAL EXCEPTION: main 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime: Process: com.megliosolutions.bitsnbytes, PID: 4922 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.app.DatePickerDialog.resolveDialogTheme(DatePickerDialog.java:88) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.app.DatePickerDialog.<init>(DatePickerDialog.java:105) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.app.DatePickerDialog.<init>(DatePickerDialog.java:82) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at com.megliosolutions.bitsnbytes.Adapters.DatePickerFragment.onCreateDialog(DatePickerFragment.java:40) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:308) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:739) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:135) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5257) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
11-08 15:08:06.175 4922-4929/com.megliosolutions.bitsnbytes W/art: Suspending all threads took: 5.023ms 
+0

貴的活動,其顯示的日期選擇器擴展'FragmentActivity'工作? –

+0

片段活動是一個片段,並顯示在該片段中。 –

+0

片段類是它打開的位置。該對話框效果很好。在時間/日期。它顯示並將按鈕文本更改爲用戶定義的輸入。然而,將該輸入保存爲字符串似乎是一個問題。 –

回答

0

工作液

我已經找到了如何得到這個工作完美無缺。

您需要確保您爲Time/Datepickers製作單獨的課程。但是,請不要使用「implements OnDateSetListener」,而應該按照原來的方式保留或移除該類,並在要使用它的活動/片段中實現OnDateSetListener。

你既可以以這種方式結合:

implements OnDateSetListener, OnTimeSetListener... 

這將允許使用,但您必須實現需要的方法。然後你的好去。

確保您正確初始化所有內容,並將所有內容放在需要編程的地方。

0

嘗試將targetFragment設置爲Request並在Request片段中實現回調。這樣你可以訪問調用片段本身的日期/時間。

在您的DatePickerFragment中,刪除OnDateSetListener並檢索從Request傳遞的目標片段。

這裏是Dialogs

public class DatePickerFragment extends DialogFragment { 

    private DatePickerDialog.OnDateSetListener dateSetListener; 

    public DatePickerFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     try { 
      dateSetListener = (DatePickerDialog.OnDateSetListener) getTargetFragment(); 
     } catch (Exception e) { 
      Log.i("[email protected]#$", e.getMessage()); 
     } 

    } 


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

    } 

} 

現在,在您Request片段一個很好的資源,調用setTargetFragment

public class Request extends Fragment implements OnDateSetListener { 

    ... 

    public Request() { 
     // Required empty public constructor 
    } 

    ... 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 


     ... 


     ... 


     RButton_Date.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DialogFragment picker = new DatePickerFragment(); 
       picker.setTargetFragment(MyFragmentDemo.this, 12345); 
       picker.show(getFragmentManager(), "datePicker"); 
      } 
     }); 

     ... 

     return rootView; 
    } 


    // Override the onDateSet() callback here. 
    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     // get the Date and do as you require. 
    } 
} 
+0

啊,在目標片段的onCreateView之外?我會盡力回覆你。 –

+0

進程:com.megliosolutions.bitsnbytes,PID:2547 11-08 10:56:46.449 2547-2547/com.megliosolutions.bitsnbytes E/AndroidRuntime:android.util.AndroidRuntimeException:在添加內容之前必須調用requestFeature() 11-08 10:56:46.449 2547-2547/com.megliosolutions.bitsnbytes E/AndroidRuntime:at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:302) 11-08 10:56: 46.449 2547-2547/com.megliosolutions.bitsnbytes E/AndroidRuntime:在com.android.internal.app.AlertController.installContent(AlertController.java:233) –

+0

**請求**必須在添加內容之前調用Feature()。 –

0

你可以試試這個對我來說這

public class DatePickerFragment extends DialogFragment { 

    private static final String ARG_DATE = "date"; 
    public static final String EXTRA_DATE = 
      "com.bignerdranch.android.criminalintent.date"; 

    private DatePicker mDatePicker; 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     Date date = (Date)getArguments().getSerializable(ARG_DATE); 

     Calendar calendar = Calendar.getInstance(); 

     calendar.setTime(date); 

     int year = calendar.get(Calendar.YEAR); 
     int month = calendar.get(Calendar.MONTH); 
     int day = calendar.get(Calendar.DAY_OF_MONTH); 

     View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_date,null); 

     mDatePicker = (DatePicker)view.findViewById(R.id.dialog_date_date_picker); 
     mDatePicker.init(year,month,day,null); 

     return new AlertDialog.Builder(getActivity()) 
       .setView(view) 
       .setTitle(R.string.date_picker_title) 
       .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         int year = mDatePicker.getYear(); 
         int month = mDatePicker.getMonth(); 
         int day = mDatePicker.getDayOfMonth(); 
         Date date = new GregorianCalendar(year, month, day).getTime(); 
         sendResult(Activity.RESULT_OK, date); 
        } 
       }) 
       .create(); 
    } 

    public static DatePickerFragment newInstance(Date date){ 

     Bundle args = new Bundle(); 
     args.putSerializable(ARG_DATE,date); 

     DatePickerFragment fragment = new DatePickerFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    private void sendResult(int resultCode,Date date){ 
     if (getTargetFragment() == null){ 
      return; 
     } 

     Intent intent = new Intent(); 
     intent.putExtra(EXTRA_DATE,date); 

     getTargetFragment().onActivityResult(getTargetRequestCode(),resultCode,intent); 

    } 
} 

和調用片段

mDateButton = (Button) view.findViewById(R.id.crime_date); 
     updateDate((mCrime.getDate()).toString()); 
     /*mDateButton.setEnabled(false);*/ 
/* Design a date picker for an application */ 
     mDateButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       FragmentManager fragmentManager = getFragmentManager(); 
       /*DatePickerFragment dialog = new DatePickerFragment();*/ 

       DatePickerFragment dialog = DatePickerFragment.newInstance(mCrime.getDate()); 

       dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE); 

       dialog.show(fragmentManager, DIALOG_DATE); 
      } 
     });