Vì một số lý do khi tôi cố gắng hiển thị Hộp thoại tôi nhận được lỗi từ dialog.show (fm, DIALOG_DATE); nói rằng Không thể giải quyết phương thức 'hiển thị (android.support.v4.app.FragmentManager, java.lang.String)'Không thể giải quyết phương thức 'hiển thị (android.support.v4.app.FragmentManager, java.lang.String)
Tại sao nó không thể giải quyết phương pháp?
mDateButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
FragmentManager fm = getActivity().getSupportFragmentManager();
DatePickerFragment dialog = new DatePickerFragment();
dialog.show(fm, DIALOG_DATE);
}
});
Dưới đây là phần còn lại của lớp học của tôi:
package com.bignerdranch.android.criminalintent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import java.util.UUID;
public class CrimeFragment extends Fragment {
//key for the extra
public static final String EXTRA_CRIME_ID = "com.bignerdranch.android.criminalintent.crime_id";
private static final String DIALOG_DATE = "date";
//holds crime
private Crime mCrime;
//widgets
private EditText mTitleField;
private Button mDateButton;
private CheckBox mSolvedCheckBox;
//at start of build
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//get crime from crime class
/*Intents
*There are two ways a fragment can access data in its activity's intent:
* an easy direct shortcut
* or a complex flexible implementation
* First try out the shortcut
* in the shortcut, CrimeFragment will access CrimeActivity's intent directly
*/
//retrieve the extra from CrimeActivity's intent and use it to fetch the Crime
//UUID crimeId = (UUID)getActivity().getIntent().getSerializableExtra (EXTRA_CRIME_ID); //shortcut removed in chapter 10 and "should feel warm and fuzzy inside for maintaining CrimeFragments Independence"
//
UUID crimeId = (UUID)getArguments().getSerializable(EXTRA_CRIME_ID);
//CrimeLab.get() requires a context object, so CrimeFragment passes the CrimeActivity
mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
}
//Create the view and inflate the layout
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for crime Fragment
//pass false because view will be added in the activitys code
View v = inflater.inflate(R.layout.fragment_crime, container, false);
//gets crime_title from fragment_crime.xml
mTitleField = (EditText)v.findViewById(R.id.crime_title);
mTitleField.setText(mCrime.getTitle());
mTitleField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//not used
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mCrime.setTitle(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
//also not used
}
});
//find date button from fragment_crime
mDateButton = (Button)v.findViewById(R.id.crime_date);
//set mDateButton text to current date and time
mDateButton.setText(mCrime.getDate().toString());
//disable button for now...enabled in chapter 12
// mDateButton.setEnabled(false);
mDateButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
FragmentManager fm = getActivity().getSupportFragmentManager();
DatePickerFragment dialog = new DatePickerFragment();
dialog.show(fm, DIALOG_DATE);
}
});
//find solved checkbox from fragment_crime
mSolvedCheckBox = (CheckBox)v.findViewById(R.id.crime_solved);
mSolvedCheckBox.setChecked(mCrime.isSolved());
//user clicks solved check box
mSolvedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
//set the crime's solved property
mCrime.setSolved(isChecked);
}
});
//returns the view
return v;
}
/*The downside to direct retrieval
*can not encapsulate fragment
* CrimeFragment is no longer a reusable building block because it expects that it will always be hosted by an activity whose intent defines extra named "EXTRA_CRIME_ID"
* CrimeFragment cannot be used with just any activity
*
*/
/*Fragment Arguments
*A better solution is to stash the mCrimeId someplace that belongs to CrimeFragment rather than keeping it in CrimeActivity's personal space
* this someplace can be an arguments bundle
* Every fragment instance can have a Bundle object attached to it
* bundle contains key value pairs that work just like the intent extras of an activity
* Pg. 195
*/
/*attaching arguments to a fragment
*Attaching args to frags must be done after the frag is created but before it is added to the activity
* To hit this window use a static class called newInstance()
* This method creates the fragment instance and bundles up and sets its arguments
*/
//for attaching arguments to a fragment
public static CrimeFragment newInstance(UUID crimeId){
Bundle args = new Bundle();
args.putSerializable(EXTRA_CRIME_ID, crimeId);
CrimeFragment fragment = new CrimeFragment();
fragment.setArguments(args);
//pass UUID from extra
return fragment;
}
}
bạn có thể đăng DatePickerFragment? – Blackbelt
'DatePickerFragment' có mở rộng' android.support.v4.app.DialogFragment' không? – matiash
@matiash DatePickerFramgent mở rộng android.app.DialogFragment thay vì android.support.v4.app.DialogFragment. Nó hoạt động bây giờ cảm ơn! – MasterProgrammer200