何らかの理由でダイアログを表示しようとすると、dialog.show(fm、DIALOG_DATE);からエラーが発生します。 メソッド 'show(Android.support.v4.app.FragmentManager、Java.lang.String)'を解決できません
メソッドを解決できないのはなぜですか?
mDateButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
FragmentManager fm = getActivity().getSupportFragmentManager();
DatePickerFragment dialog = new DatePickerFragment();
dialog.show(fm, DIALOG_DATE);
}
});
クラスの残りの部分は次のとおりです。
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;
}
}
これを解決するには、Android.app.DialogFragmentを使用している場合、getFragmentManager()を使用します:
mDateButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
FragmentManager fm = getActivity().getFragmentManager();
DatePickerFragment dialog = new DatePickerFragment();
dialog.show(fm, DIALOG_DATE);
}
});
getSupportFragmentManager() を使用するには、Android.support.v4から拡張する必要があります。 app.DialogFragment。
インポートを確認します。
import Android.support.v4.app.DialogFragment;
これで問題は解決しました。
public void showDatePicker() {
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getFragmentManager(),"datePicker");
}