2014-12-16 24 views
31

Bir iletişim kutusu göstermeye çalıştığımda, dialog.show (fm, DIALOG_DATE); söyleme yöntemi 'show (android.support.v4.app.FragmentManager, java.lang.String)' çözümlenemiyor 'Yöntem gösterilemiyor 'show (android.support.v4.app.FragmentManager, java.lang.String)

Neden bu yöntemi çözemiyor? İşte

mDateButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      FragmentManager fm = getActivity().getSupportFragmentManager(); 
      DatePickerFragment dialog = new DatePickerFragment(); 
      dialog.show(fm, DIALOG_DATE); 
     } 
    }); 

benim sınıfın geri kalanı şudur: android.app.DialogFragment kullanıyorsanız

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; 
} 

}

+0

Eğer DatePickerFragment gönderebilir? – Blackbelt

+1

"DatePickerFragment", "android.support.v4.app.DialogFragment" işlevini genişletiyor mu? – matiash

+0

@matiash DatePickerFramgent android.support.v4.app.DialogFragment yerine android.app.DialogFragment genişletilmiş. Şimdi çalışıyor, teşekkürler! – MasterProgrammer200

cevap

90

, bu çözmek için, daha sonra kullanın: getFragmentManager()

mDateButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      FragmentManager fm = getActivity().getFragmentManager(); 
      DatePickerFragment dialog = new DatePickerFragment(); 
      dialog.show(fm, DIALOG_DATE); 
     } 
    }); 

kullanmak getSupportFragmentManager(), DatePickerFragment(), aşağıdakilerden genişletmelidir: android.support.v4.app.DialogFragment

İçe aktarma kontrol edin:

import android.support.v4.app.DialogFragment;