2014-09-13 3 views
2

J'ai un problème pour appeler une fonction de mon activité sur DialogFragment. Il y a des fonctions publiques dans mon MainActivity que j'ai besoin d'appeler pour des calculs qui sont faits dans le DialogFragment. Chaque fois que j'essaie d'appeler une fonction avec getActivity(). il se produit le problème "Impossible de résoudre la méthode".Android: fonction d'appel de l'activité sur DialogFragment

Voici comment je l'appelle DialogFragment dans le MainActivity:

FragmentManager fm = getSupportFragmentManager(); 
     DialogWeekly dialogWeekly = new DialogWeekly(); 
     dialogWeekly.show(getFragmentManager(), "fragment_dialogWeekly"); 

Et voilà comment le DialogFragment ressemble. J'ai ajouté deux lignes de commentaires où le problème mentionné se produit:

public class DialogReminder extends DialogFragment implements AdapterView.OnItemSelectedListener { 

//--- Static Variables -----------------------------------------------------------------------// 
private static final String MY_PREFS = "my_preferences"; 
private static Activity activity; 
private static TimePicker timePicker; 
private static View dialogReminderView; 

//--- Integer Variables ----------------------------------------------------------------------// 
private Integer weekday; 

//--- String Variables -----------------------------------------------------------------------// 
private String weekdayString; 

//--- Other Variables ------------------------------------------------------------------------// 
private SharedPreferences sharedPreferences; 


/** 
* Empty constructor required for DialogFragment 
*/ 
public DialogReminder() { } 

/** 
* Called when a fragment is first attached to its activity. 
* onCreate(Bundle) will be called after this 
* @param activity Activity that is attached to this fragment 
*/ 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
} 

//--- Override Functions ---------------------------------------------------------------------// 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.dialog_weekly, container); 
} 

@NonNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    sharedPreferences = getActivity().getSharedPreferences(MY_PREFS, Context.MODE_PRIVATE); 

    return createAlertDialog(); 
} 

@Override 
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
    Integer selectedItem = parent.getSelectedItemPosition(); 
    weekdayString = parent.getItemAtPosition(pos).toString(); 
    // Here is the problem: savePreferences -> cannot resolve method 
    getActivity().savePreferences("spinnerSelectionWeekday", String.valueOf(selectedItem)); 

    weekday = selectedItem + 2; 
    if (weekday == 8) { 
     weekday = 1; 
    } 
} 

@Override 
public void onNothingSelected(AdapterView<?> parent) { 
    // Another interface callback 
} 

//--- General Activity Functions -------------------------------------------------------------// 

/** 
* 
* @return 
*/ 
private AlertDialog createAlertDialog() { 
    AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); 
    alert.setTitle(getResources().getString(R.string.optionReminder)); 
    alert.setView(dialogReminderView); 

    alert.setNegativeButton(getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    alert.setPositiveButton(getResources().getString(R.string.ok), new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      setReminder(); 
      dialog.cancel(); 
     } 
    }); 

    setElementsGUI(); 

    return alert.create(); 
} 

/** 
* 
*/ 
private void setElementsGUI() { 
    Spinner spinner = (Spinner) dialogReminderView.findViewById(R.id.reminderWeekdaySpinner); 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), 
      R.array.reminderSpinnerArray, android.R.layout.simple_spinner_item); 
    // Specify the layout to use when the list of choices appears 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner.setOnItemSelectedListener(this); 
    spinner.setAdapter(adapter); 
    spinner.setSelection(Integer.parseInt(sharedPreferences.getString("spinnerSelectionWeekday", "0"))); 
} 

//--- Button Functions -----------------------------------------------------------------------// 

/** 
* 
*/ 
private void setReminder() { 
    // Here is the problem: all functions with getActivity() -> cannot resolve method 
    getActivity().checkReminder(); 
    getActivity().setWeekdayReminder(weekday); 
    getActivity(("hour", String.valueOf(timePicker.getCurrentHour())); 
    getActivity().savePreferences("minute", String.valueOf(timePicker.getCurrentMinute())); 

    getActivity().checkReminder(); 

    String hour = String.valueOf(getActivity().getHour()); 
    if (hour.length() < 2) { 
     hour = "0" + hour; 
    } 
    String minute = String.valueOf(getActivity().getMinute()); 
    if (minute.length() < 2) { 
     minute = "0" + minute; 
    } 
    String time = hour + ":" + minute; 

    String message = getResources().getString(R.string.reminderToast, weekdayString, time); 
    Toast toast = Toast.makeText(getActivity().getApplicationContext(), message, Toast.LENGTH_LONG); 
    toast.show(); 
} 

}

Répondre

4

Alors que getActivity() retourne une MainActivity lors de l'exécution, le compilateur doit supposer que c'est juste un objet d'activité et que ces méthodes don n'existe pas (puisqu'une activité n'a aucune de ces méthodes). D'où l'erreur du compilateur.

Ce que vous devez faire est jeté l'activité à un objet MainActivity comme ceci:

((MainActivity)getActivity()).savePreferences(... 
+0

Merci pour cette indication. Il fonctionne comme un charme. Encore une question: est-il préférable de stocker ((MainActiviy) getActivity()) une fois dans une variable au lieu d'utiliser à nouveau l'expression entière à chaque fois? – Marco

+0

MainActivity mainActivity = ((MainActiviy) getActivity()); a certainement du sens. Mais ne le stockez dans une variable locale pas une variable d'instance ou vous pourriez avoir des fuites de mémoire. –