我打开一个DatePickerFragment并选择一个新日期,但日期不会返回上一个片段的额外意图。我不确定为什么以及使用调试器进行仔细检查 “java.lang.ClassNotFoundException:[LObject;”当方法到达代码上的断点时。 我正在关注BigNerdRanch教程。
这是我的CrimeFragment
public class CrimeFragment extends Fragment {
private Crime mCrime;
private EditText mTitleField;
private Button mDateButton;
private CheckBox mSolvedCheckBox;
public static final String EXTRA_CRIME_ID =
"xxx.com.criminalintent.crime_id";
public static final String DIALOG_DATE = "date";
public static final int REQUEST_DATE = 0;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
UUID crimeId = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID);
mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
View v = inflater.inflate(R.layout.fragment_crime, parent, false);
mTitleField = (EditText)v.findViewById(R.id.crime_title);
mTitleField.setText(mCrime.getTitle());
mTitleField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence c, int start, int count, int after) {
//Left blank
}
@Override
public void onTextChanged(CharSequence c, int start, int before, int count) {
mCrime.setTitle(c.toString());
}
@Override
public void afterTextChanged(Editable c) {
// Left blank
}
});
mDateButton = (Button)v.findViewById(R.id.crime_date);
updateDate();
mDateButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
FragmentManager fm = getActivity()
.getSupportFragmentManager();
DatePickerFragment dialog = DatePickerFragment
.newInstance(mCrime.getDate());
dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE);
dialog.show(fm, DIALOG_DATE);
}
});
mSolvedCheckBox = (CheckBox)v.findViewById(R.id.crime_solved);
mSolvedCheckBox.setChecked(mCrime.isSolved());
mSolvedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//Set the crimes solved property.
mCrime.setSolved(isChecked);
}
});
return v;
}
public void updateDate(){
mDateButton.setText(mCrime.getDate().toString());
}
public static CrimeFragment newInstance(UUID crimeId){
Bundle args = new Bundle();
args.putSerializable(EXTRA_CRIME_ID, crimeId);
CrimeFragment fragment = new CrimeFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode != Activity.RESULT_OK){
return;
}
if(requestCode == REQUEST_DATE){
Date date = (Date)data
.getSerializableExtra(DatePickerFragment.EXTRA_DATE);
mCrime.setDate(date);
updateDate();
}
}
}
这是我的DatePickerFragment
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.View;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
/**
* Created by xxx on 11/09/14.
*/
public class DatePickerFragment extends DialogFragment {
public static final String EXTRA_DATE =
"xxx.com.criminalintent.date";
private Date mDate;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
mDate = (Date)getArguments().getSerializable(EXTRA_DATE);
//Create a calendar to view year, month, day.
Calendar calendar = Calendar.getInstance();
calendar.setTime(mDate);
//Assign the calendar date to local variables.
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
View v = getActivity().getLayoutInflater()
.inflate(R.layout.dialog_date, null);
DatePicker datePicker = (DatePicker)v.findViewById(R.id.dialog_date_datePicker);
datePicker.init(year, month, day, new OnDateChangedListener(){
public void onDateChanged(DatePicker view, int year, int month, int day){
mDate = new GregorianCalendar(year, month, day).getTime();
//Update argument to preserve values on rotation.
getArguments().putSerializable(EXTRA_DATE, mDate);
}
});
return new AlertDialog.Builder(getActivity())
.setView(v)
.setTitle(R.string.date_picker_title)
.setPositiveButton(
android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
sendResult(Activity.RESULT_OK);
}
})
.create();
}
/**
* Static method to instanciate the DatePickerFragment
* @param date
* @return
*/
public static DatePickerFragment newInstance(Date date){
Bundle args = new Bundle();
args.putSerializable(EXTRA_DATE, date);
DatePickerFragment fragment = new DatePickerFragment();
fragment.setArguments(args);
return fragment;
}
private void sendResult(int resultCode){
if(getTargetFragment() == null){
return;
}
Intent i = new Intent();
i.putExtra(EXTRA_DATE, mDate);
getTargetFragment()
.onActivityResult(getTargetRequestCode(), resultCode, i);
}
}
答案 0 :(得分:0)
onActivityResult()
方法的第一个if语句看起来很可疑:requestCode != Activity.RESULT_OK
。你可能想检查一下resultCode
。